2011-10-20 19 views
6

我想從clojure.java.jdbc創建/刪除數據庫。這失敗了:如何從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")) 

因爲do-commands啓動一個事務,顯然你不能在事務中刪除或創建數據庫。有任何想法嗎?

謝謝!

回答

6

就拿do-commandshere)來源並加以移除調用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

太棒了,謝謝。我會以此爲提醒,始終注意來源:) – prismofeverything

1

對於較新的Clojure的版本中,建議的方法不再起作用。我成功地使用了這個功能:

(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

無交易執行功能被編入db-do-commands

現在這個稍微簡單版本工作:

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

如果不指定false作爲第二個參數,它不會工作,因爲它會試圖啓動一個事務。