我正在研究java中的数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但我希望它适用于不同的数据库。从 mysql 复制并在 derby 等中创建。使用 JDBC,我们可以收集有关表及其列的足够信息。但是我要问这个,如果我可以使用 sql free 在 java 上重新创建表。我的意思是不同的数据库有不同的数据类型,有时它们的 sql 语法也不同。那么 JDBC 或任何其他库(可以是开源的)能否以一种简单且全球化的方式完成这项工作?
4 回答
Apache 的DdlUtils完成了我需要的工作。当我搜索crossdb时发现它,它非常有用但功能强大。它可以从头开始生成数据库,只需使用参数。或者它可以抓取现有的数据库表定义,也可以使用索引定义。如果需要,您可以使用分隔符(对我来说,使用 Apache Derby 是一个非常重要的选择)。您可以打印出这些定义或将它们直接应用到源数据库(我还没有尝试过第二个)。它翻译所选数据库的定义。但是一个大问题是没有关于如何开始使用它的好的教程。我搜索了这些包以找到一个好的起点。这是我所取得的成就,一个生成完整数据库表创建 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);
我不知道 JDBC 具有执行此操作的通用工具。您可能必须创建一个实用程序库来生成用于创建表的 SQL。
从一个执行 ANSI SQL 的程序开始,并在您打算支持的尽可能多的平台上对其进行测试。请记住,Java 仍然是一次编写,到处调试,因此您需要在您打算支持该系统的任何平台上对其进行测试。如果您必须对任何平台的 create 语句进行辩证变体,则将生成器子类化。
试试 SchemaCrawler,它也是开源的,用 Java 编写。它提供对数据库元数据的编程访问,还允许在 JavaScript 中编写脚本。 http://schemarawler.sourceforge.net/
尝试查看 HIBERNATE 为迁移提供了什么。我知道 H 可以从数据库模式和模型对象的模式生成模型对象。所以也许你可以重用 HIBERNATE 的一些部分。他们有 DIALECT 的概念,这正是您所说的:定义数据库实现的细节。