Как создать сценарий sql из журнала изменений после сравнения двух баз данных с использованием Java?

1

Я сравнил две базы данных с linibase java API 3.3.2, затем сгенерировал файл changelog.xml. Теперь я хочу сгенерировать sql-скрипт, который будет обновлять целевую базу данных. вот мой код:

Database database;
Database database2;
try {
    database = CommandLineUtils.createDatabaseObject(org.postgresql.Driver.class.getClassLoader(), "jdbc:postgresql://localhost:5432/loan", "postgres", "", "org.postgresql.Driver", null, null, false, false, null, null, null, null, null);
    database2=CommandLineUtils.createDatabaseObject(org.postgresql.Driver.class.getClassLoader(), "jdbc:postgresql://localhost:5432/loan2", "postgres", "", "org.postgresql.Driver", null, null, false, false, null, null, null, null, null);
    Liquibase liquibase = new Liquibase("", new FileSystemResourceAccessor(), database);
    DiffResult result = liquibase.diff(database, database2, new CompareControl());
    DiffToChangeLog diffLog = new DiffToChangeLog(result, new DiffOutputControl());
    diffLog.print(System.out);
    //new DiffToReport(result, System.out).print();

} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

EDIT Вот как я это сделал, благодаря Стиву Дони:

        Database database;
    Database database2;
    try {
        database = CommandLineUtils.createDatabaseObject(org.postgresql.Driver.class.getClassLoader(), "jdbc:postgresql://localhost:5432/loan", "postgres", "", "org.postgresql.Driver", null, null, false, false, null, null, null, null, null);
        database2= CommandLineUtils.createDatabaseObject(org.postgresql.Driver.class.getClassLoader(), "jdbc:postgresql://localhost:5432/loan2", "postgres", "", "org.postgresql.Driver", null, null, false, false, null, null, null, null, null);

        // generate the changelog that contains the differences
        CommandLineUtils.doDiffToChangeLog("changelog.xml", database, database2, new DiffOutputControl(), null, null);

        // generate the sql script from the changeLog (without executing it)
        File sql = new File("output.sql");
        Liquibase liquibase = new Liquibase("changelog.xml", new FileSystemResourceAccessor(), database);
        liquibase.update("Update", new FileWriter(sql));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  • 0
    Это работает? Если нет, то какие проблемы вы видите? У хороших вопросов есть 3 вещи: 1 - что я сделал. 2 - что я ожидал 3 - что на самом деле произошло.
  • 0
    @SteveDonie этот код выводит файл changelog.xml, который представляет различия, обнаруженные между двумя базами данных, верно? но я не знаю, как создать сценарий sql, который будет обновлять целевую базу данных.
Теги:
liquibase

1 ответ

0
Лучший ответ

Один из способов приблизиться к этому - увидеть, что делает сама Liquibase при запуске из командной строки. В этом случае вы обычно используете команду diffChangeLog для создания журнала изменений, а затем запускаете updateSQL для генерации SQL, необходимого для обновления базы данных. Глядя на исходный код liquibase.integration.commandline.Main для liquibase.integration.commandline.Main, я вижу, что он использует метод Liquibase.update() с аргументами, которые указывают не нулевой вывод записи (который является файлом, который SQL будет сохранен в).

  • 0
    Спасибо Стив, что сделал работу :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню