Insertar datos en columnas postgresql json usando clojure.java.jdbc
(1)
Estoy tratando de hacer una inserción en una columna json en una base de datos postgresql usando clojure.java.jdbc/insert!
. No estoy seguro de qué formato de datos se debe utilizar al insertar json.
Definición de la tabla:
CREATE TABLE errors (
id character varying(24) NOT NULL PRIMARY KEY,
body json NOT NULL
);
Tratando de usar datos literales en un formato de mapa:
=> (insert! db :errors {:id "a" :body {:message "A error"}}
{:id "b" :body {:message "B error"}})
PSQLException No hstore extension installed. org.postgresql.jdbc2.AbstractJdbc2Statement.setMap (AbstractJdbc2Statement.java:1709)
Alternativamente como una cadena codificada json:
=> (insert! db :errors {:id "a" :body "{/"message/":/"A error/"}"}
{:id "b" :body "{/"message/":/"B error/"}"})
PSQLException ERROR: column "body" is of type json but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 46 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2198)
No parece haber una manera obvia de hacer esto. De particular importancia es que necesito poder insertar muchos registros en una sola consulta en lugar de uno por uno, ¡una insert!
conveniencia insert!
está proveyéndome
¿Cuál es una manera simple de insertar varios registros en una tabla de postgres que tiene una columna json usando clojure.java.jdbc?
Como clojure.java.jdbc expone algunos protocolos, incluido clojure.java.jdbc/ISQLValue
, puede ampliarlo para permitir el suministro de json como un mapa ordinario de clojure. Travis Vachon proporciona una explicación detallada de este proceso y un fragmento de código que lo implementa.
También encontré una biblioteca, clj-postgresql , que implementa mucha funcionalidad extra de postgres, incluidos los tipos de datos json y jsonb. Simplemente puede requerir clj-postgresql.types
y se importará el soporte json.