2016-05-05 5 views
1

既存の埋め込みDerbyデータベースがあり、このデータベースを作成するために必要なSQLコマンドをリバースエンジニアリングしたいとします。ユーザーがテーブルを選択してテーブルの作成スクリプトを取得できるようにすることで、これを行うツールがいくつかあります。 SQuirreL SQL、NetBeansなどはこの機能を許可します。私はこれを行うために取られたアプローチを理解することに興味があります。Derbyデータベースのデータベース作成コマンドをプログラムで取得する

この問題は、(JDBCを使用して)データベースからすべてのデータを(データベースの構造を破壊することなく)削除するという課題があります。これを行うには、通常、データベースの制約を削除し、SQL truncateコマンドを発行する必要があります。アプローチの概要についてはpostを参照してください。ただし、制約を削除すると構造が変更されます。

任意のデータベースの作成スクリプトをリバースエンジニアリングできる場合は、データベースをリフレッシュする(すべてのデータを消去する)必要がある場合は、作成スクリプトをキャプチャしてデータベースを削除してからスクリプトを使用してデータベースを再作成します。私はこれを任意のデータベースに対して実行したい。 JDBC準拠のデータベースで動作するJDBCのみを使用するアプローチが理想的です。

その他の関連するStackOverFlow Q/Aには、truncate all tables in MySQLの方法が含まれています。ここでの推奨事項は、MySQL固有のようですが、いくつかの洞察を提供しています。ダービーのためにturn of referential constraintsに行く方法はないようです。

おそらくすでにこれ用に開発済みのオープンソースAPIがあります。私は自分でやる前にいくつかのアイデアを探しています。

+0

[DdlUtils](https://db.apache.org/ddlutils/)のようなものがあなたに役立つであろうか? –

+0

DdlUtilsは明確な可能性を秘めています。それは私が調査するcreateTablesSql()メソッドを持っています。誰かがそれを経験しているかどうかを知ることに興味があります。 –

答えて

1

Gord Thompsonが指摘したように、DdlUtilsを使用してテストを構築しました。私は作成スクリプトを再現することができました。

Derbyインストールで取得した基本のjdbcDemoデータベースでテストしました。ダービーdocsで説明されているWwdEmbedded.javaクラスを実行する必要があります。私の例でデータベースを作成します。ここ

は、例えば、コードは次のとおり

// the database name 
    String dbName = "jdbcDemoDB"; 
    // define the Derby connection URL to use 
    String connURL = "jdbc:derby:" + dbName; 

    EmbeddedDataSource eds = new EmbeddedDataSource(); 
    //eds.setConnectionAttributes(connURL); 
    eds.setDatabaseName(dbName); 
    System.out.println(eds); 
    try { 
     Platform p = PlatformFactory.createNewPlatformInstance(eds); 
     Database db = p.readModelFromDatabase("temp"); 
     String createTablesSql = p.getCreateTablesSql(db, true, true); 
     System.out.println(createTablesSql); 

    } catch (SQLException ex) { 
     Logger.getLogger(DbTester.class.getName()).log(Level.SEVERE, null, ex); 
    } 

出力は次のようである:


- WISH_LIST


DROPテーブルWISH_LIST。


- WISH_LIST


は表WISH_LIST(IDENTITYとしてデフォルトでGENERATED WISH_ID INTEGER NOT NULL、 ENTRY_DATE TIMESTAMP、 WISH_ITEM VARCHAR(32)NOT NULL)を作成します。

+0

残念ながら、元のテーブルを作成するために使用されたSQL文字列と正確には一致しません。それは近いです。CREATE TABLE WISH_LIST(WISH_ID INTは常にIDENTITY CONSTRAINT WISH_PK PRIMARY KEY、ENTRY_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP、WISH_ITEM VARCHAR(32)NOT NULLのように生成されます) –

+0

あなたは 'GENERATED ALWAYS AS IDENTITY'として列を作成し、DDLUtilsは「既定の身分証明書によって生成されたもの」?それはDDLUtilsのバグのように思えます。 –

+0

DDLUtilsにバグがあるのか​​、それがどう機能するのかは不明です。 –

関連する問題