Postgres / JDBC 与 pgjdbc-ng:将 EAN 类型写入数据库

Posted

技术标签:

【中文标题】Postgres / JDBC 与 pgjdbc-ng:将 EAN 类型写入数据库【英文标题】:Postgres / JDBC with pgjdbc-ng: Writing EAN type to database 【发布时间】:2020-03-25 10:53:08 【问题描述】:

我正在使用 postgres 12、PGJDBC-NG 0.8.3org.clojure/java.jdbc 0.7.10

我正在尝试将我的代码从使用标准 postgres JDBC 实现 (https://jdbc.postgresql.org/) 切换到 pgjdbc-ng (https://impossibl.github.io/pgjdbc-ng/),以便我可以使用现有 postgres JDBC 所缺乏的侦听/通知功能。

我已设法使基本功能正常工作,但在将 EAN13 类型插入数据库时​​遇到了一些问题(扩展类型:https://www.postgresql.org/docs/9.1/isn.html)。

这是一个示例表:

create extension isn;
create table p (barcode ean13 primary key);
insert into p values ('5023652298064');
select barcode from p;
+-----------------+
| barcode         |
|-----------------|
| 502-365229806-4 |
+-----------------+

现在在我的代码中,我有一个记录 EAN 用于插入 eans:

(defrecord ean [s])

(def ds (doto (PGDataSource.)
          (.setDatabaseUrl "jdbc:pgsql://localhost:5432/web?user=root")))

(jdbc/execute! :datasource ds
            ["update products set ean = ? where id = 5242" (db/->ean "5012583002819")])
Execution error (IllegalStateException) at com.impossibl.postgres.types.Type/getParameterFormat (Type.java:318).
type has no supported parameter format: ean13(3767891)

这是我在股票 postgres JDBC 中设置正确类型的代码:

(extend-protocol clojure.java.jdbc/ISQLParameter
  ean
  (set-parameter [val ^PreparedStatement stmt ^long i]
    ; The type of this parameter should be PGObject, which is a wrapper provided by
    ; the postgres JDBC driver for types which does not have a corresponding type in
    ; the JDBC interface.
    (.setObject stmt i (doto (PGobject.)
                         (.setType "ean13")
                         (.setValue (.s val))))))

但我一生都无法弄清楚这如何转化为适用于 PGJDBC-NG 的东西!什么是正确的 ISQLParameter 扩展以使其正常工作?

【问题讨论】:

我正在解决基本相同的问题。你做了什么来解决这个问题? 恐怕最后我意识到我真的不需要监听/通知,所以放弃了。 【参考方案1】:

看起来您可以将 PGobject 复制到您的项目中并正常导入。好像没什么特别的。

【讨论】:

以上是关于Postgres / JDBC 与 pgjdbc-ng:将 EAN 类型写入数据库的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 JDBC 与 Postgres 建立 SSL 连接时出现 PSQLException“无法打开 SSL 根证书文件”

postgres jdbc 客户端证书用户与数据库用户

kafka JDBC源连接器无法获取postgres表

通过 JDBC 连接到 postgres 服务器时 sslmode 参数的默认值?

最新的 Postgres JDBC41 不能与 HikariCP 和 Hibernate 一起使用:isValid() 未实现

Android 无法直接连接 Postgres 数据库,也无法使用 JDBC 连接