回答

收藏

用Clojure插入PostgreSQL数组

技术问答 技术问答 293 人阅读 | 0 人回复 | 2023-09-14

我找不到用Clojure插入Postgres数组类型的方法。. p; t3 D7 N" E) H
(sql/insert! db :things {:animals ["cow" "pig"]})2 f6 C, K) ]) o% \7 Y. W3 e5 V
没按我预期的那样工作。错误信息:
  M* `9 r9 m" n& E1 QPSQLException Can't infer the SQL type to use for an instance of clojure.lang.PersistentVector. Use setObject() with an explicit Types value to specify the type to use.  org.postgresql.jdbc2.AbstractJdbc2Statement.setObject (AbstractJdbc2Statement.java:1936)& M; a! O& v, q' d# O! C
即使是我能找到的对SQL的最直接访问也不起作用:9 W" I. g; ]" w+ t
(sql/execute! db "INSERT INTO things (animals) VALUES ('{\"cow\", \"pig\"}')")+ d& _$ j; K/ n1 q2 h
真的不知道这是怎么回事:
4 F# y5 [! v1 g0 SClassCastException java.lang.Character cannot be cast to java.lang.String  clojure.java.jdbc/prepare-statement (jdbc.clj:419)  c( P: l2 C% d; S
当然一定有可能吗?如果不是通过辅助函数,则通过某种方式执行原始SQL。9 n7 v* G( q; ~/ a& h
                ( f- N$ C: Z' {" G* k  v
解决方案:
0 |1 J0 i# c. w* N, F               
) |' @' c" M' k/ F( |/ C- }& H* F/ ]$ i; x

$ r3 e1 _0 J: I$ g9 `                使用 插入!
, q. n. D+ s+ a! Y5 E  w2 ?$ |要插入字符串向量,您必须(从字符串向量中)创建一个实现java.sql.Array的对象。您可以使用java.sql.Connection.createArrayOf创建此类对象& y9 p; E( a4 E$ B
(def con (sql/get-connection db))
; N5 I4 L7 U6 T4 ^7 v3 Z# U! l(def val-to-insert 0 N' B- v/ a# d  C- O* i1 [
    (.createArrayOf con "varchar" (into-array String ["cow", "pig"]))
8 W. f; o+ e1 \  D(sql/insert! db :things {:animals val-to-insert})
& T1 T+ c+ L, f5 g( s- y
6 Z: }1 q# e8 W8 o$ E- t) a3 b! Yclojure.java.jdbc的文档可以1 ?0 _, R3 k9 b
执行! 说
0 i* v* M2 ~. _% E: h/ S(execute! db-spec [sql & params] :multi? false :transaction? true)
* W% |7 o. i1 y1 P8 r/ K(execute! db-spec [sql & param-groups] :multi? true :transaction? true)
3 y- l+ ~% i$ z6 d3 _您必须将sql字符串放入向量中才能起作用。
- y9 c: H, u* ~* ?& }(sql/execute! db ["INSERT INTO things (animals) VALUES ('{\"cow\", \"pig\"}')"])
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则