Миграция базы данных

Я работаю над инструментом миграции базы данных в java. Инструмент копирует таблицы базы данных с их данными в базу данных назначения. Но я хочу, чтобы он работал с разными базами данных. Скопируйте из mysql и создайте в derby и т. д. С помощью JDBC мы можем собрать достаточно информации о таблице и ее столбцах. Но я собираюсь спросить об этом, могу ли я воссоздать таблицы на java с помощью sql бесплатно. Я имею в виду, что разные базы данных имеют разные типы данных, и иногда они различаются синтаксисом sql. Так может ли JDBC или любая другая библиотека (может быть с открытым исходным кодом) выполнять эту работу простым и глобальным способом?


person mndeveci    schedule 20.04.2009    source источник


Ответы (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);
person mndeveci    schedule 20.04.2009
comment
DdlUtils хорош, но он по-прежнему не поддерживает NVARCHAR (который, поскольку Java 6 является основным типом JDBC в java.sql.Types) - person Andrew Swan; 11.06.2009
comment
да еще есть баги. например, если вы выберете mysql в качестве источника и derby в качестве цели. он выберет longvarchar для типа текста. но некоторые данные не подходят для этого типа. поэтому вам нужно вручную установить его на clob. - person mndeveci; 13.06.2009

Я не знаю, есть ли у JDBC универсальное средство для этого. Вероятно, вам придется создать служебную библиотеку, которая генерирует SQL для создания таблицы.

Начните с того, который поддерживает ANSI SQL, и протестируйте его на таком количестве платформ, которое вы собираетесь поддерживать. Помните, что Java по-прежнему поддерживает однократную запись, отлаживает везде, поэтому вам нужно будет протестировать это на любой платформе, на которой вы собираетесь поддерживать систему. Подкласс генератора, если вам нужно сделать диалектические вариации оператора create для любой из ваших платформ.

person ConcernedOfTunbridgeWells    schedule 20.04.2009

Попробуйте SchemaCrawler, который также имеет открытый исходный код и написан на Java. Он обеспечивает программный доступ к метаданным базы данных, а также позволяет создавать сценарии на языке JavaScript. http://schemacrawler.sourceforge.net/

person Sualeh Fatehi    schedule 05.06.2009

попробуйте посмотреть, что HIBERNATE предоставляет для миграции. Я знаю, что H может генерировать объекты модели из схемы базы данных и схемы из объектов модели. Так что, возможно, вы можете повторно использовать некоторые части из HIBERNATE. У них есть понятие DIALECT, которое делает именно то, что вы говорите: определяет особенности реализации db.

person silmx    schedule 20.04.2009
comment
я искал через спящий режим и JDO. Но мне просто нужно заменить ex: mysql longtext на derby clob. Hibernate имеет больше способностей, которые мне не нужны, и их очень сложно освоить, в любом случае спасибо - person mndeveci; 20.04.2009