yesql - 列名的命名参数

yesql - named parameter for column name

我有一个简单的更新语句:

-- name: add-response!
UPDATE survey
  SET :question = :response
  WHERE caseid = :caseid

我这样调用它:

(add-response! db-spec "q1" 2 1001)

但是,yesql 不喜欢使用字符串作为列的参数 - 它将 "q1" 转换为 'q1',这不是有效的 postgres 语法。

"BatchUpdateException Batch entry 0 UPDATE survey SET 'q1' = 2
WHERE caseid = 1001 was aborted."

有没有办法让它工作?我试过使用问题名称作为符号:'q1.这不起作用,因为:

"PSQLException Can't infer the SQL type to use for an instance of clojure.lang.Symbol."

前段时间我用yesql遇到了同样的问题,所以我研究了它的源代码。我发现 yesql 将查询转换为

UPDATE survey SET :question = :response WHERE caseid = :caseid

["UPDATE survey SET ? = ? WHERE caseid = ?" question response caseid]

并将其提供给 clojure.java.jdbc/query. So this is just a prepared statement. According to this Whosebug question 无法将列名作为参数传递给数据库查询。这实际上是有道理的,因为准备好的语句的目的之一是强制值始终被视为值,从而保护您免受 SQL 注入或类似问题的影响。

根据您的情况,您可以使用 clojure.java.jdbc/update!,因为它明确允许参数化的列名称:

(:require [clojure.java.jdbc :as j])
(j/update! db-spec :survey
           {"q1" 2}
           ["caseid = ?" 1001])

希望对您有所帮助。干杯!