2016-02-19 7 views
5

Ho provato passando un vettore clojure, anche provato il seguente formato:Come inserire e aggiornare gli array postgres usando yesql in clojure?

-- name: insert-into-sometable<! 
-- inserts in the sometable the lid and uids 
INSERT INTO sometable 
(lid, uids) values(:lid, ARRAY[:uids]) 

Ma entrambi i metodi tiri errore dati incongruenti.

Penso che se posso chiamare le funzioni di matrice postgres dal file di query, aggiornare e inserire può essere fatto facilmente. Per favore aiuto.

Grazie in anticipo

+0

Posso essere abbaiare sull'albero sbagliato, ma [questo mi sembra un buon punto di partenza] (https://github.com/remodoy/clj-postgresql/blob/master/README.md). Non sono sicuro se ciò si applica a Yesql però. –

risposta

4

Il messaggio di errore del 2 ° tentativo dà un suggerimento sottile:

AssertionError Assert failed: Query argument mismatch. 
Expected keys: (:uids]) 
Actual keys: (:uids) 
Missing keys: (:uids]) 

Apparentemente le cose vanno verso sud quando yesql tenta di analizzare la chiave :uids mentre aggiunge la parentesi di chiusura della definizione di matrice. Consente di provare qualcosa di diverso:

-- name: insert-into-sometable<! 
-- inserts in the sometable the lid and uids 
INSERT INTO sometable 
(lid, uids) values(:lid, ARRAY[ :uids ]) 

Avviso gli spazi aggiuntivi tra :uids e le staffe di array.

=> (insert-into-sometable<! {:lid 1, :uids [1 2 42]) 
;; => 1 

Sembra un bug in yesql a me, :uid] dovrebbe mai avere analizzato come una chiave valida.

Modifica: stava per presentare un errore con yesql, ma è già stato risolto con la versione 0.5.2 rilasciata di recente.

1

Array SQL non sono supportate da yesql, ma clojure.java.jdbc offre un punto di estensione nel ISQLParameter protocol, che può essere utilizzato come:

(deftype StringArray [items] 
    clojure.java.jdbc/ISQLParameter 
    (set-parameter [_ stmt ix] 
    (let [as-array (into-array Object items) 
      jdbc-array (.createArrayOf (.getConnection stmt) "text" as-array)] 
     (.setArray stmt ix jdbc-array)))) 

(insert-into-sometable<! db-spec "hi" (->StringArray ["one" "two"])) 

Nota che non è possibile estendere vettori di Clojure come vettori ha un special meaning in yesql

Problemi correlati