【问题标题】:Dynamic values passing in Prepared Statement在 Prepared Statement 中传递的动态值
【发布时间】:2014-02-28 05:55:48
【问题描述】:

我正在使用 Clojure.java.jdbc 访问 clojure 中的数据库。 我想在 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 需要一个不带 () 或 [] 的参数列表。

【问题讨论】:

    标签: jdbc clojure


    【解决方案1】:

    JDBC 查询和准备好的值一起需要是一个集合。因此,您需要从字符串和参数化值的集合中创建一个集合。要将单个项目添加到集合的前面,请使用 cons

    (jdbc/query (:conn dbinfo) (cons sql-query (map values-builder params)))
    

    【讨论】:

      【解决方案2】:

      在参数中使用 apply 来拼接

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

      【讨论】:

      • 感谢您的回复。我试过了,得到一个异常:原因:java.sql.SQLException:没有为参数1指定值
      • apply 用于将所有参数的集合作为单独的参数应用到函数。在这里,他需要将集合的项目添加到第二个参数,该参数应该是字符串和准备值的集合。因此,partial 和 apply 的组合不会使这项工作发挥作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2020-04-12
      • 1970-01-01
      • 2014-01-25
      • 2014-10-23
      相关资源
      最近更新 更多