Search code examples
postgresqlclojure

How do I drop or create a database from clojure.java.jdbc?


I would like to create/drop a database from clojure.java.jdbc. This fails:

(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"))

because do-commands starts a transaction, and apparently you can't drop or create databases inside a transaction. Any ideas?

Thanks!


Solution

  • Take the source for do-commands (here) and remove the call to transaction:

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