【问题标题】:Is it possible to patch load SQL statements from a file using clojure.java.jdbc?是否可以使用 clojure.java.jdbc 从文件中修补加载 SQL 语句?
【发布时间】:2013-02-13 17:51:12
【问题描述】:

我需要能够在 clojure 中加载和执行包含多个 SQL 语句的文件。例如,假设我有一个包含如下语句的文件:

ALTER TABLE bla...;
ALTER TABLE foo...;
UPDATE bla SET ...;
UPDATE foo SET ...;
ALTER TABLE bla DROP...;
ALTER TABLE foo DROP...;

你明白了 - 一个包含许多以分号结尾的语句的文件。

我目前在尝试使用do-commands 时遇到以下错误:

PSQLException org.postgresql.util.PSQLException: Too many update results were returned.

【问题讨论】:

  • 两年后我遇到了同样的问题——使用 yesql。我真的必须退出 yesql 才能做到这一点吗?

标签: postgresql jdbc clojure


【解决方案1】:

我最终解决这个问题的方式是这样的:

(ns myns.db
  (:require [clojure.java.jdbc :as sql]            
            [clojure.java.io :refer [resource]]))

(defn db-conn [] ...)

(defn exec-sql-file  
   [file]  
   (sql/with-connection (db-conn)
    (sql/do-prepared
      (slurp (resource file)))))

...

; from your lein project where src/sql/some-statements.sql is the file you want to load
(exec-sql-file "sql/some-statements.sql")

我很想听听其他人是如何处理这个问题的。有没有更好的办法?

【讨论】:

    【解决方案2】:

    我正在使用[org.clojure/java.jdbc "0.7.9"]。接受的答案对我不起作用。这就是我实现同样壮举的方式:

    我的文件内容:

    ["insert into user (email , password, name, type) values ('carlos@myshoppingapp.com', 'password', 'Carlos Frank', 'admin')"
    "insert into user (email , password, name, type) values ('alice@gmail.com', 'password', 'Alice Williams', 'customer')"
    "insert into user (email , password, name, type) values ('piyush@gmail.com', 'password', 'Piyush Goyal', 'customer')"] 
    

    请注意,整个文件内容都包含在一个向量中,并且每个 sql 都用双引号引起来。

    读取此文件并填充数据库的代码:

    (defn exec-sql-file  
       [file]  
         (jdbc/db-do-commands db-spec  (read-string (slurp file))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2010-09-25
      • 2022-10-14
      相关资源
      最近更新 更多