2011-10-20 24 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")) 

क्योंकि डू-कमांड लेनदेन शुरू करता है, और स्पष्ट रूप से आप लेनदेन के अंदर डेटाबेस को छोड़ या बना नहीं सकते हैं। कोई विचार?

धन्यवाद!

उत्तर

6

do-commands (here) के लिए स्रोत ले लो और transaction का कॉल निकालना: नए clojure संस्करण के साथ

(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

, सुझाव दिया दृष्टिकोण नहीं रह गया काम करता है। मैं इस समारोह के साथ सफल रहा था:

(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

transactionless निष्पादन कार्यक्षमता db-do-commands में लपेट दिया गया था।

अब इस थोड़ा सरल संस्करण काम कर रहा है:

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

आप दूसरा तर्क के रूप में झूठी निर्दिष्ट नहीं करते हैं, यह के रूप में यह एक सौदे शुरू करने का प्रयास करेंगे काम नहीं करेगा।

संबंधित मुद्दे