2016-01-28 8 views
9

Próbuję zrobić wstawkę do kolumny json w bazie danych PostgreSQL przy użyciu clojure.java.jdbc/insert!. Nie jestem pewien, który format danych powinien być używany podczas wstawiania json.Wstawianie danych do kolumn json w postgresql przy użyciu clojure.java.jdbc

definicja Tabela:

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

Próbując wykorzystać dane dosłowne w formacie mapy:

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

Alternatywnie jako json zakodowany ciąg:

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

Tam nie wydają być oczywistym sposobem na zrobienie tego. Szczególnie ważne jest to, że muszę mieć możliwość wstawiania wielu rekordów w pojedynczym zapytaniu zamiast jednego po drugim, co zapewnia mi wygoda insert!.

Jaki jest prosty sposób wstawienia kilku rekordów do tabeli postgres posiadającej kolumnę json przy użyciu clojure.java.jdbc?

Odpowiedz

6

Ponieważ clojure.java.jdbc udostępnia kilka protokołów, w tym clojure.java.jdbc/ISQLValue, można go rozszerzyć, aby umożliwić dostarczanie json jako zwykłej mapy clojure. Travis Vachon zapewnia a thorough explanation of this process i implementację kodu kodu.

Znalazłem także bibliotekę, clj-postgresql, która implementuje wiele dodatkowych funkcji postgre, w tym typy danych json i jsonb. Możesz po prostu wymagać clj-postgresql.types, a obsługa json zostanie zaimportowana.

+0

Link do "dokładnego wyjaśnienia tego procesu" jest martwy! Czy masz alternatywne źródło? – rdgd

+0

@rdgd Zastąpiono go linkiem do archiwum internetowego. –

Powiązane problemy