私はJavaでデータベース移行ツールに取り組んでいます。このツールは、データベース テーブルとそのデータをコピー先データベースにコピーしています。しかし、私はそれが異なるデータベースで動作することを望んでいます。mysql からコピーし、derby などで作成します。JDBC を使用すると、テーブルとその列に関する十分な情報を収集できます。しかし、SQLを使用せずにJavaでテーブルを再作成できるかどうか、これを尋ねるつもりです。つまり、データベースが異なればデータ型も異なり、場合によっては SQL 構文が異なります。では、JDBC やその他のライブラリ (オープン ソースの場合もあります) は、この仕事を簡単かつグローバルな方法で行うことができますか?
4 に答える
Apache のDdlUtilsは、私が必要としているものを実行します。crossdb について検索しているときに見つかりました。これは非常に便利でありながら強力です。パラメータだけで、データベースをゼロから生成できます。または、既存のデータベース テーブル定義を、インデックス定義と共に取得することもできます。必要に応じて区切り文字を使用できます (これは、Apache Derby を使用する上で非常に重要なオプションです)。これらの定義を印刷するか、ソース データベースに直接適用することができます (2 つ目の定義はまだ試していません)。選択したデータベースの定義を変換します。しかし、1 つの大きな問題は、それを使い始める方法についての適切なチュートリアルがないことです。パッケージを検索して、開始するのに適した場所を見つけました。これが私が達成したことです。完全なデータベーステーブルを生成するサンプルコードはSQLを作成します。
DerbyPlatform dp = new DerbyPlatform();
dp.setDelimitedIdentifierModeOn(true);
Database dbs = new Database();
DerbyModelReader dmr = new DerbyModelReader(dp);
Database test = dmr.getDatabase(conn, "MyDBTest");
DerbyBuilder db = new DerbyBuilder(dp);
String testSqlDerby = dp.getCreateTablesSql(test, true, true);
System.out.println(testSqlDerby);
System.out.println("\n\n\n\n");
MySql50Platform mp = new MySql50Platform();
mp.setDelimitedIdentifierModeOn(true);
MySqlBuilder mb = new MySqlBuilder(mp);
String testSqlMysql = mp.getCreateTablesSql(test, true, true);
System.out.println(testSqlMysql);
これもオープン ソースであり、Java で記述されています。データベース メタデータへのプログラムによるアクセスを提供し、JavaScript でのスクリプト作成も可能にします。 http://schemarawler.sourceforge.net/
これを行うための一般的な機能を持つ JDBC については知りません。おそらく、テーブル作成用の SQL を生成するユーティリティ ライブラリを作成する必要があります。
ANSI SQL を実行するものから始めて、サポートする予定のプラットフォームの数だけテストしてください。Java は依然として write-once であり、どこでもデバッグできるため、システムをサポートする予定のプラットフォームでこれをテストする必要があることを忘れないでください。プラットフォームのいずれかで create ステートメントの弁証法的バリエーションを作成する必要がある場合は、ジェネレーターをサブクラス化します。
HIBERNATE が移行のために提供するものを確認してみてください。私は、H がデータベース スキーマからモデル オブジェクトを生成し、モデル オブジェクトからスキーマを生成できることを知っています。したがって、HIBERNATE の一部のパーツを再利用できるかもしれません。彼らは、まさにあなたが言っていることを行う DIALECT の概念を持っています: db 実装の詳細を定義します。