2016-01-28 14 views
9

clojure.java.jdbc/insert! kullanarak postgresql veritabanında bir json sütununa ekleme yapmayı deniyorum. Ben json eklerken hangi veri formatının kullanılması gerektiğinden emin değilim.Verileri clojure.java.jdbc kullanarak postgresql json sütunlarına ekleme

Tablo tanım:

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

harita biçimindeki değişmez verileri kullanmak çalışıyorum:

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

Alternatif bir json kodlanmış dize:

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

görünmüyor Bunu yapmak için bariz bir yol olmak. Özellikle önemli olan tek bir sorguda tek bir sorguda birden fazla kayıt ekleyebilmem gerektiğidir, insert! bana uygun bir kolaylık sağlıyor.

clojure.java.jdbc kullanarak bir json sütununa sahip bir postgres tablosuna birkaç kayıt eklemek için basit bir yol nedir?

cevap

6

clojure.java.jdbc, clojure.java.jdbc/ISQLValue dahil olmak üzere birkaç iletişim kuralı oluşturduğundan, json'u sıradan bir clojure haritası olarak sağlamak için genişletebilirsiniz. Travis Vachon, a thorough explanation of this process ve onu uygulayan bir kod snippet'i sağlar.

Ayrıca json ve jsonb veri türleri de dahil olmak üzere çok sayıda ekstra postgre işlevi uygulayan bir kitaplık, clj-postgresql buldum. Sadece clj-postgresql.types gerektirebilir ve json desteği alınacaktır.

+0

"Bu işlemin tam açıklaması" bağlantısı kesildi! Alternatif bir kaynağın var mı? – rdgd

+0

@rdgd Bir internet arşiv bağlantısı ile değiştirildi. –