【问题标题】:load SQL statements from a file using clojure.java.jdbc使用 clojure.java.jdbc 从文件加载 SQL 语句
【发布时间】:2016-05-04 13:43:30
【问题描述】:

REST 调用将 branchId 和 emplId 发送到此 exec-sql-file 方法。我将这些作为参数传递。当我通过 branch_id = @branchid 和 empl_id = @emplid 时,我无法执行 SQL 语句。但是当我对 branch_id = 'BR101' 和 empl_id = 123456 进行硬编码时,它就可以工作了。有什么建议如何在我的 some-statements.sql 中获取 branch_Id 和 empl_Id?

(defn exec-sql-file
  [branchid emplid]
  (sql/with-db-connection (db-conn)
    (sql/db-do-prepared conn
      [branchid emplid (slurp (resource "sql/some-statements.sql"))])))

some-statements.sql 有这个查询

DELETE from customer where branch_id = @branchid and empl_id = @emplid;

我从 REPL 执行这个

(exec-sql-file "BR101" 123456)

我从下面的帖子中获取代码 sn-p。

Is it possible to patch load SQL statements from a file using clojure.java.jdbc?

【问题讨论】:

    标签: jdbc clojure


    【解决方案1】:

    没有简单的方法可以做到这一点,因为您的方法要求您必须在一次运行中为多个 SQL 语句提供参数。另一个问题是 Java 的 PreparedStatement(由 clojure.java.jdbc 在后台使用)不支持命名参数,因此即使必须为每个占位符提供使用单个预准备语句完成的多个 SQL 语句的参数(@987654324 @)。

    我建议以下解决方案:

    • 对要执行的每个 SQL 语句使用多个准备好的语句(因此单独的 clojure.java.jdbc/execute! 调用),包装在单个事务中(每个 SQL 可以从单独的文件中读取)。您还可以使用一些帮助程序库(如YeSQL)来从外部文件加载您的 SQL 语句并将它们公开为您可以作为普通 Clojure 函数调用的函数。这很简单,但是如果您更改要执行的语句数量,则需要更改代码

    • 创建一个存储过程并从提供参数的 Clojure 调用它们 - 这将为一些将在 DB 端定义的 DB 逻辑定义一个接口。除非您更改存储过程的接口,否则您可以在不更改 Clojure 代码或重新部署的情况下修改其实现

    • 实现您自己的将命名参数插入“多语句”SQL 文件的逻辑。问题是适当地转义参数的值,这样您的代码就不会受到 SQL 注入的影响。我不鼓励这种解决方案。

    【讨论】:

    • 感谢 Piotrek 的回复。 some-statements.sql 文件还具有 Update、Insert 功能,并且 where 子句是 branchid 和 emplid 用于所有 sql 语句。
    • @Aiswa,从这个问题对我来说并不明显。我已更新我的答案以反映这一要求。
    • 我以其他方式尝试过。如果我做错了什么,请告诉我。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多