我在clojure中使用Clojure.java.jdbc进行数据库访问。 我想用select。
来使用预准备语句从我之前的问题中我得到了这样的答案,
(jdbc/query (:conn dbinfo)
["select * from users where username = ? and password = ?"
"harikk09"
"amma123"])
它也在努力。
现在,
这个参数列表我想动态化。所以我写了一个像
这样的函数(defn values-builder (fn[param] (:value @(:value (param 1)))))
实际上可以正常工作并使用println返回值集合。
(println (map values-builder params))
给出
(harikk09 amma123)
但是当我尝试像这样执行它时,sql-query是前面提到的查询
(jdbc/query (:conn dbinfo) sql-query (map values-builder params))
,它引发了一个例外:
Caused by: java.lang.IllegalArgumentException: No value supplied for key:
Clojure.lang.LazySeq@ab5111fa
有人可以帮我纠正这个错误吗?
我认为clojure需要一个没有()或[]的参数列表。
答案 0 :(得分:1)
JDBC查询和准备好的值一起需要是一个集合。因此,您需要从字符串和参数化值集合中创建集合。要将单个项目添加到集合的前面,请使用cons
(jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params)))
答案 1 :(得分:0)
使用apply to splice in arguments
(apply jdbc/query (:conn dbinfo) sql-query (map values-builder params))
更新:如下所述,适用不起作用,因为sql需要在带有参数的向量中 在这种情况下,您需要将sql查询包含在生成的参数列表
中(jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params)))