2

clojureまたはjavaを使用してjdbcを介してデータベースから「テーブル作成スクリプト」を生成するために利用できるものがあるかどうか誰かが知っていますか?

システムテーブルまたは情報スキーマからフェッチすることもできますが、データベースの種類ごとに異なります。たとえば、MSSQLは、情報スキーマから作成テーブル(またはビュー)を構築し、ibm.systablesからdb2を構築するためのクエリである必要があります。この問題がJDBCの世界で以前に解決されていることを期待していました。

たとえば、ソースデータベースとターゲットデータベースの間でcreatetableステートメントを比較したいと考えています。

ありがとう、

4

2 に答える 2

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

他のDBでは、これから始めることができます。

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

)。

于 2013-03-22T18:23:16.550 に答える
0

Hibernateツールプロジェクトを使用してみてください。Hibernateマッピングを生成し、そこからcreateステートメントを生成できます。

しかし、データベースがあなたのためにそれを行うことができるのに、なぜそのように行くのですか...

于 2013-03-22T13:36:13.540 に答える