我有一个简单的更新声明:
-- name: add-response!
UPDATE survey
SET :question = :response
WHERE caseid = :caseid
我这样调用它:
(add-response! db-spec "q1" 2 1001)
但是,yesql并不喜欢使用字符串作为列的参数 - 它会翻译" q1"到' q1',这不是有效的postgres语法。
" BatchUpdateException批量输入0更新调查SET' q1' = 2
caseid = 1001中止了。"
有没有办法让这项工作?我尝试使用问题名称作为符号:' q1。这不起作用,因为:
" PSQLException无法推断用于实例的SQL类型 clojure.lang.Symbol"
答案 0 :(得分:4)
前段时间我和yesql有同样的问题,所以我调查了它的源代码。我发现yesql转换了像
这样的查询UPDATE survey SET :question = :response WHERE caseid = :caseid
到
["UPDATE survey SET ? = ? WHERE caseid = ?" question response caseid]
并将其提供给clojure.java.jdbc/query。所以这只是一份准备好的声明。根据{{3}},无法将列名作为参数传递给数据库查询。这实际上是有意义的,因为准备语句的目的之一是强制值始终被视为值,从而保护您免受SQL注入或类似问题的影响。
我的情况是,你可以使用this StackOverflow question,因为它清楚地允许参数化的列名:
(:require [clojure.java.jdbc :as j])
(j/update! db-spec :survey
{"q1" 2}
["caseid = ?" 1001])
希望有所帮助。干杯!