【问题标题】:Clojure and HugSQL; how to provide SQL keywords?Clojure 和 HugSQL;如何提供 SQL 关键字?
【发布时间】:2016-03-23 13:19:49
【问题描述】:

我使用 HugSQL 定义了这个查询:

-- :name ins! :! :n
INSERT INTO table (col0, col1, col2) VALUES :tuple*:values;

如何从 Clojure 向该查询发送 SQL 关键字?特别是我怎么能做这样的事情,

(ins! db {:values [[val0 val1 :DEFAULT] [val2 val3 val4]]})

这样查询就变成了

INSERT INTO table (col0, col1, col2) VALUES (val0, val1, DEFAULT), (val2, val3, val4)

即如何使用Clojure中的SQL关键字DEFAULT?

谢谢。

附:我正在使用 clojure.java.jdbc 和 postgresql。

【问题讨论】:

  • 你可以试试hugsql.org/#param-sql
  • 谢谢,我如何将它与上面的 :tuple*:values 结合起来插入多行?

标签: sql jdbc clojure


【解决方案1】:

由于元组列表参数类型(:tuple*)是一种基于值的参数类型,它遵循底层jdbc库进行参数替换,因此不能使用它来插入原始/关键字sql。这实际上是关于 JDBC 对此缺乏支持的注释:Sending the DEFAULT placeholder via JDBC?

但是,您可以使用 HugSQL 的 Clojure Expressions 获取 :values 元组列表并重新编写查询以将 Clojure 关键字视为 SQL 关键字,并将所有其他值视为 SQL 值参数。下面,我们使用 HugSQL 的 Deep Get Param Name 功能来引用元组中给定索引的值参数。

-- :name insert-with-default :<!
/* :require [clojure.string :as string] */
insert into test (c1, c2, c3)
values
/*~ 
(string/join ","
  (map-indexed
    (fn [tuple-index tuple]
      (str 
        "(" 
        (string/join ","
          (map-indexed
            (fn [value-index value]
              (if (keyword? value)
                (name value)
                (str 
                  ":v:values." 
                  tuple-index "." 
                  value-index))) 
            tuple))
        ")"))
     (:values params)))
~*/
returning *

导致(假设 5 是 c3 的默认值):

(insert-with-default-sqlvec {:values [[1 2 :default]
                                      [3 4 :default]]})

;=> ["insert into test (c1, c2, c3)\n
      values  (?,?,default),(?,?,default) returning *" 1 2 3 4]

(insert-with-default db {:values [[1 2 :default]
                                  [3 4 :default]]})

;=> ({:c1 1, :c2 2, :c3 5} {:c1 3, :c2 4, :c3 5})

【讨论】:

  • 使用/重用它的下一步可能是创建一个仅包含此表达式的snippet,然后在查询中使用 sn-p 参数类型。
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 2010-10-17
  • 1970-01-01
  • 2012-12-20
  • 2011-02-13
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多