Jdbc 在Prepared语句中传递动态值
我正在使用Clojure.java.jdbc访问Clojure中的数据库。 我想在select中使用准备好的语句 从我之前的问题我得到了这样的答案Jdbc 在Prepared语句中传递动态值,jdbc,clojure,Jdbc,Clojure,我正在使用Clojure.java.jdbc访问Clojure中的数据库。 我想在select中使用准备好的语句 从我之前的问题我得到了这样的答案 (jdbc/query(:conn dbinfo) [“从用户名=?和密码=?”的用户中选择*” “harikk09” “amma123”]) 它也在起作用 现在, 这个参数列表是我想动态设置的。所以我写了一个函数,比如 (定义值生成器(fn[param](:value@(:value(param 1)())))) 它实际上工作正常,并使用pri
(jdbc/query(:conn dbinfo)
[“从用户名=?和密码=?”的用户中选择*”
“harikk09”
“amma123”])
它也在起作用
现在,
这个参数列表是我想动态设置的。所以我写了一个函数,比如
(定义值生成器(fn[param](:value@(:value(param 1)()))))
它实际上工作正常,并使用println返回值的集合
(println(映射值生成器参数))
给予
(harikk09 amma123)
但当我尝试这样执行它时,其中sql查询就是前面提到的查询
(jdbc/query(:conn dbinfo)sql查询(映射值生成器参数))
,它会引发一个异常:
Caused by: java.lang.IllegalArgumentException: No value supplied for key:
Clojure.lang.LazySeq@ab5111fa
有人能帮我纠正这个错误吗
我认为clojure需要一个没有()或[]的参数列表。在参数中使用apply-to-splice
(apply jdbc/query (:conn dbinfo) sql-query (map values-builder params))
更新:如下所述,apply不起作用,因为sql需要位于带有参数的向量中
在这种情况下,您需要将sql查询限制到生成的参数列表上
(jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params)))
JDBC查询和准备好的值一起需要是一个集合。因此,您需要从字符串和参数化值的集合中创建一个集合。要将单个项目预先添加到集合的前面,请使用
cons
(jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params)))
谢谢你的回复。我尝试了它,得到了一个异常:由以下原因引起:java.sql.SQLException:如果要将所有参数的集合作为单独的参数应用于函数,则不使用为参数1apply指定的值。在这里,他需要将集合的项添加到第二个参数中,该参数应该是字符串和准备好的值的集合。因此,partial和apply的组合都不能实现这一点。