假设我有一个现有的嵌入式Derby数据库,并且我想对创建此数据库所需的SQL命令进行反向工程。有许多工具可以通过允许用户选择表并获取表的创建脚本来实现此目的。 SQuirreL SQL,NetBeans等允许此功能。我有兴趣了解采取这种做法的方法。
这个问题是由程序化(通过JDBC)从数据库中删除所有数据(不破坏数据库结构)的挑战所驱动的。为此,您通常需要删除数据库上的约束,然后发出SQL truncate命令。请参阅此post以了解该方法并概述该方法。但是,删除约束会改变结构。
如果我可以(通过SQL或JDBC方法)对任何数据库的创建脚本进行反向工程,那么当数据库需要刷新(清除所有数据)时,我可以捕获创建脚本,删除数据库,然后重新 - 通过脚本创建数据库。我想为任意数据库执行此操作。只使用JDBC的方法适用于任何符合JDBC的数据库,这是理想的。
其他相关的StackOverFlow Q / A包括如何truncate all tables in MySQL这里的建议似乎是MySQL特定的,但确实提供了一些见解。对于德比而言,turn of referential constraints似乎没有办法。
也许已经开发了一个开源API。在我自己做之前,我正在寻找一些想法。
答案 0 :(得分:1)
我使用DdlUtils构建了一个测试,如Gord Thompson所述。我能够重现一个创建脚本。
我在使用Derby安装获得的基本jdbcDemo数据库上进行了测试。您需要运行Derby 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 TABLE WISH_LIST;
- WISH_LIST
创建表WISH_LIST( WISH_ID INTEGER NOT NULL由默认为身份生成, ENTRY_DATE TIMESTAMP, WISH_ITEM VARCHAR(32)NOT NULL);