yesql - 列名的命名参数

时间:2015-03-23 04:36:52

标签: postgresql clojure

我有一个简单的更新声明:

-- 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"

1 个答案:

答案 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])

希望有所帮助。干杯!