2016-01-28 19 views
9

Sto cercando di inserire un inserto in una colonna json in un database postgresql utilizzando clojure.java.jdbc/insert!. Non sono sicuro di quale formato di dati debba essere usato quando si inserisce JSON.Inserimento di dati in colonne json postgresql utilizzando clojure.java.jdbc

definizione Tabella:

CREATE TABLE errors (
    id character varying(24) NOT NULL PRIMARY KEY, 
    body json NOT NULL 
); 

Cercando di utilizzare i dati letterali in un formato carta:

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

alternativa come JSON stringa codificata:

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

Non sembra essere un modo ovvio per farlo. Di particolare importanza è che ho bisogno di essere in grado di inserire molti record in una singola query invece di uno a uno, una comodità che mi sta fornendo insert!.

Che cosa è un modo semplice per inserire più record in una tabella postgres con una colonna json usando clojure.java.jdbc?

risposta

6

Poiché clojure.java.jdbc espone alcuni protocolli, incluso clojure.java.jdbc/ISQLValue, è possibile estenderlo per consentire la fornitura di json come una normale mappa del clojure. Travis Vachon fornisce a thorough explanation of this process e uno snippet di codice che lo implementa.

Ho anche trovato una libreria, clj-postgresql, che implementa molte funzionalità extra di postgres, inclusi i tipi di dati json e jsonb. Puoi semplicemente richiedere clj-postgresql.types e il supporto JSON verrà importato.

+0

Il collegamento alla "spiegazione approfondita di questo processo" è morto! Hai una fonte alternativa? – rdgd

+0

@rdgd Sostituito con un collegamento di archivio Internet. –

Problemi correlati