2011-10-20 10 views
6

Vorrei creare/eliminare un database da clojure.java.jdbc. Ciò non riesce:Come posso eliminare o creare un database da 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")) 

poiché i comandi di comando avvia una transazione e apparentemente non è possibile eliminare o creare database all'interno di una transazione. Qualche idea?

Grazie!

risposta

6

Prendere la fonte per do-commands (here) e rimuovere la chiamata a 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

Impressionante, grazie. Prenderò questo come promemoria per guardare sempre alla fonte:) – prismofeverything

1

Con le versioni più recenti Clojure, l'approccio suggerito non funziona più. Ho avuto successo con questa funzione: la funzionalità di esecuzione

(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

La transactionless è stato rotolato in db-do-commands.

Ora questa versione leggermente più semplice sta lavorando:

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

Se non si specifica falsa come secondo argomento, non funzionerà come tenterà di avviare una transazione.

Problemi correlati