Postgres / JDB C с pgjdb c -ng: запись типа EAN в базу данных - PullRequest
1 голос
/ 25 марта 2020

Я использую postgres 12, PGJDBC-NG 0.8.3 и org.clojure/java.jdbc 0.7.10.

Я пытаюсь переключить свой код с использования стандартной реализации postgres JDB C (* От 1005 *https://jdbc.postgresql.org/) до pgjdb c -ng (https://impossibl.github.io/pgjdbc-ng/), чтобы я мог использовать функцию прослушивания / уведомления, которой нет у postgres JDB C.

Мне удалось заставить работать базовую c функциональность, но у меня возникли некоторые проблемы при вставке типов 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 JDB C:

(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))))))

, но я не могу понять, как это работает на PGJDB C -NG! Какое правильное расширение ISQLParameter, чтобы это работало?

...