2011-10-20 22 views
6

Tôi muốn tạo/thả một cơ sở dữ liệu từ clojure.java.jdbc. Đây không:Làm cách nào để thả hoặc tạo cơ sở dữ liệu từ clojure.java.jdbc?

(require '[clojure.java.jdbc :as sql]) 

(def db 
    {:classname "org.postgresql.Driver" 
    :subprotocol "postgresql" 
    :subname "//localhost/postgres" 
    :user "postgres"}) 

(defn drop-database [name] 
    (sql/do-commands (str "drop database " name))) 

(sql/with-connection db 
    (drop-database "db_name")) 

vì do-lệnh bắt đầu một giao dịch, và dường như bạn không thể thả hoặc tạo cơ sở dữ liệu bên trong một giao dịch. Bất kỳ ý tưởng?

Cảm ơn!

Trả lời

6

Lấy nguồn cho do-commands (here) và loại bỏ các cuộc gọi đến transaction:

(defn drop-database [name] 
    (sql/with-connection db 
    (with-open [s (.createStatement (sql/connection))] 
     (.addBatch s (str "drop database " name)) 
     (seq (.executeBatch s))))) 
+0

Tuyệt vời, cảm ơn bạn. Tôi sẽ coi đây là lời nhắc để luôn xem xét nguồn:) – prismofeverything

1

Với phiên bản mới hơn clojure, cách tiếp cận đề nghị không còn hoạt động. Tôi đã thành công với chức năng này:

(defn exec-db-command [db command] 
    (jdbc/with-db-connection [conn db] 
    (with-open [s (.createStatement (:connection conn))] 
     (.executeUpdate s command)))) 

(exec-db-command db "create database foo") 
0

Chức năng thực thi giao dịch được cuộn thành db-do-commands.

Bây giờ phiên bản hơi đơn giản này đang làm việc:

(jdbc/db-do-commands postgres-db false "CREATE DATABASE foo") 

Nếu bạn không xác định sai như là đối số thứ hai, nó sẽ không làm việc vì nó sẽ cố gắng để bắt đầu một giao dịch.

Các vấn đề liên quan