Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用clojure.jdbc查询列表_Jdbc_Clojure - Fatal编程技术网

如何使用clojure.jdbc查询列表

如何使用clojure.jdbc查询列表,jdbc,clojure,Jdbc,Clojure,这永远不会返回任何结果。我也试过用“?”来代替“(?)”AFAIR你不能直接这么做。带有查询结果的幕后宏使用java.sql.PreparedStatement并为每个参数调用.setObject。所以你必须写这样的东西 (sql/with-connection {... mydatabase } (sql/with-query-results rows [ "select * from users where email in (?)" [ "bob@site.com"

这永远不会返回任何结果。我也试过用“?”来代替“(?)”

AFAIR你不能直接这么做。带有查询结果的幕后宏
使用java.sql.PreparedStatement并为每个参数调用.setObject。所以你必须写这样的东西

(sql/with-connection {... mydatabase }
    (sql/with-query-results rows [ "select * from users where email in (?)" 
       [ "bob@site.com" "mary@other.com" ] ] 
       (doseq [rows row] 
            (prn row))))
要生成带有“in”参数的已准备好的sql字符串:
“请从接收电子邮件的用户中选择*(\”bob@site.com\", \"mary@other.com\“”“


更好的方法是只使用像sqlkorma这样的clojure sql库。

现在到2020年,您可以不用字符串连接就可以做到这一点,至少在postgres中是这样

扩展isqlparmeter协议,如下所示:

(sql/with-connection db
  (sql/with-query-results rs
    [(str "select * from users where email in ("
          (apply
           str
           (interpose ", " (map #(str "\"" % "\"")
                                ["bob@site.com" "mary@other.com"]))) ")")]
    ...))
然后可以运行如下查询

; This allows us to use clojure arrays as query parameters for JDBC.
; Thus, we don't need to do string concatenation to make IN clauses.
(extend-protocol clojure.java.jdbc/ISQLParameter
  Sequential
  ; Important: Sometimes you have to explicitly specify the type of array like ?::text[].
  (set-parameter [v ^PreparedStatement stmt ^long i]
    (let [conn (.getConnection stmt)
          meta (.getParameterMetaData stmt)
          type-name (.getParameterTypeName meta i)]
      (if-let [elem-type (when (= (first type-name) \_) (apply str (rest type-name)))]
        (.setObject stmt i (.createArrayOf conn elem-type (to-array v)))
        (.setObject stmt i v)))))

=ANY(array)
语法与
in
子句的作用相同-据我所知,
in
子句在postgres内部被转换为
=ANY(array)
-不过不要引用我的话。

这可能会导致SQL注入你是对的。它不是完整的解决方案,需要改进或由现有库替换。
(jdbc/query db/db ["select 'banana' = ANY(?) as banana_included, 
                           'apple' = ANY(?) as apple_included" 
                   ["banana" "potato"] ["banana" "potato"]])