我希望能够为jdbc编写以下功能:
(def db {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname "//127.0.0.1:3306/santacsv"
:server "//127.0.0.1:3306"
:schema "santa"
:user "root"
:password "root"})
(defn has-schema? [db & [schema]])
(defn create-schema [db & [schema]])
(defn drop-schema [db & [schema]])
我不确定该怎么做。任何帮助,将不胜感激
我在这里实现了自己的:
https://github.com/zcaudate/manas/blob/master/src/manas/core.clj
(defmacro run-statement [env database body catch-body & [statement]]
`(do (Class/forName (:classname ~env))
(let [~'conn (atom nil)]
(try
(reset! ~'conn (DriverManager/getConnection
(str "jdbc:" (:subprotocol ~env) ":"
(:server ~env) "/" (or ~database (:database ~env)))
(:user ~env)
(:password ~env)))
~@(if statement
[(list 'let '[stmt (.createStatement @conn)]
(list '.executeUpdate 'stmt statement))])
~@body
(catch SQLException ~'e
~@catch-body)
(finally
(if-not (nil? (deref ~'conn))
(.close (deref ~'conn))))))))
(defn has-connection? [env & [url]]
(let [env (if url (assoc env :server url) env)]
(run-statement env "" (true) (false))))
(defn all-databases [env]
(run-statement env ""
((let [rs (.getCatalogs (.getMetaData @conn))]
(loop [rs rs acc []]
(if (.next rs)
(recur rs (conj acc (.getString rs "TABLE_CAT")))
acc))))
()))
(defn has-database? [env & [schema]]
(run-statement env schema (true) (false)))
(defn create-database [env & [schema]]
(run-statement env ""
(true)
(false)
(str "create database " (or schema (:database env)))))
(defn drop-database [env & [schema]]
(run-statement env ""
(true)
(false)
(str "drop database " (or schema (:database env)))))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句