有没有人知道是否有任何东西可以使用clojure或java通过jdbc从数据库生成“创建表脚本”?
我可以从系统表或信息模式中获取,但是根据不同的数据库类型。例如,MSSQL必须是从信息模式和ibm.systables的db2构建create table(或view)的查询。希望这个问题可能在JDBC世界之前已经解决了。
例如,我正在寻找在源数据库和目标数据库之间区分create table语句。
谢谢,
答案 0 :(得分:1)
在MySQL中,您可以使用show create table
:
(require '[clojure.java.jdbc :as jdbc])
(defn gen-script [db table]
(jdbc/with-connection db
(jdbc/with-query-results rs [(str "show create table " table)]
(get (first rs) (keyword "create table")))))
试验:
(def db {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname (str "//localhost:3306/testtest")
:user "root"
:password "..."})
(println (gen-script db "example"))
=> CREATE TABLE `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
在其他数据库中,您可以从这个开始:
(defn- gen-script [db table]
(jdbc/with-connection db
(let [conn (jdbc/connection)
meta (.getMetaData conn)]
(format "create table %s (\n%s\n)"
table
(apply str
(interpose ",\n"
(map (fn [x]
(format " %s %s(%s)%s%s%s"
(:column_name x)
(:type_name x)
(:column_size x)
(if (not= "YES" (:is_nullable x)) " NOT NULL" "")
(if (= "YES" (:is_autoincrement x)) " AUTO_INCREMENT""")
(if (= "YES" (:column_def x)) " DEFAULT" "")))
(resultset-seq (.getColumns meta nil nil table "%")))))))))
试验:
(println (gen-script db "example"))
=> create table example (
id INT(10) NOT NULL AUTO_INCREMENT,
name VARCHAR(30),
age INT(10)
)
答案 1 :(得分:0)
尝试使用hibernate工具项目。它将生成一个hibernate映射,您可以从中生成create语句。
但是,为什么数据库可以为您做到这一点...