Я работаю над инструментом миграции базы данных в java. Инструмент копирует таблицы базы данных с их данными в базу данных назначения. Но я хочу, чтобы он работал с разными базами данных. Скопируйте из mysql и создайте в derby и т. д. С помощью JDBC мы можем собрать достаточно информации о таблице и ее столбцах. Но я собираюсь спросить об этом, могу ли я воссоздать таблицы на java с помощью sql бесплатно. Я имею в виду, что разные базы данных имеют разные типы данных, и иногда они различаются синтаксисом sql. Так может ли JDBC или любая другая библиотека (может быть с открытым исходным кодом) выполнять эту работу простым и глобальным способом?
Миграция базы данных
Ответы (4)
Apache DdlUtils сделал то, что мне нужно. Когда я искал информацию о crossdb, я нашел ее, и она очень полезна, но мощна. Он может создать базу данных с нуля, просто с параметрами. Или он может захватывать существующие определения таблиц базы данных, а также определения индексов. Вы можете использовать разделитель, если хотите (для меня очень важно использовать Apache Derby). Вы можете просто распечатать эти определения или применить их непосредственно к исходной базе данных (второй вариант я еще не пробовал). Он переводит определения для выбранной базы данных. Но одна большая проблема заключается в том, что нет хорошего руководства о том, как начать его использовать. Я просмотрел пакеты, чтобы найти хорошее место для начала. Вот чего я добился: пример кода для создания полной таблицы базы данных create 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://schemacrawler.sourceforge.net/
попробуйте посмотреть, что HIBERNATE предоставляет для миграции. Я знаю, что H может генерировать объекты модели из схемы базы данных и схемы из объектов модели. Так что, возможно, вы можете повторно использовать некоторые части из HIBERNATE. У них есть понятие DIALECT, которое делает именно то, что вы говорите: определяет особенности реализации db.