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])
希望对您有所帮助。干杯!
我有一个简单的更新语句:
-- 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])
希望对您有所帮助。干杯!