Как мне удалить или создать базу данных из clojure.java.jdbc? - PullRequest
7 голосов
/ 20 октября 2011

Я хотел бы создать / удалить базу данных из 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-команды запускает транзакцию, и, очевидно, вы не можете удалить или создать базы данных внутри транзакции. Есть идеи?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 20 октября 2011

Возьмите источник для do-commands ( здесь ) и удалите вызов на transaction:

(defn drop-database [name]
  (sql/with-connection db
    (with-open [s (.createStatement (sql/connection))]
      (.addBatch s (str "drop database " name))
      (seq (.executeBatch s)))))
2 голосов
/ 12 июня 2016

Функциональность выполнения без транзакций была свернута в db-do-commands.

Теперь эта немного более простая версия работает:

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

Если вы не укажете false в качестве второго аргумента, этоне будет работать, так как попытается начать транзакцию.

0 голосов
/ 17 июля 2019
(defn create-database [name]
  (jdbc/with-db-connection [conn {:connection-uri "jdbc:postgresql://localhost/postgres?user=username&password=yourpassword"}]
    (jdbc/db-do-commands conn false (str "CREATE DATABASE " name) ))
0 голосов
/ 19 июня 2015

В более новых версиях 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...