Может ли Flyway или Liquibase генерировать обновление script вместо обновления базы данных напрямую?
Во-первых, немного фона. У меня есть набор приложений Java, некоторые из них основаны на JPA, а некоторые нет. Чтобы создать мои базы данных, я в настоящее время использую экспорт схемы Hibernates для создания сценариев создания для тех, кто использует JPA. Те, кто не использует JPA, я генерирую скрипты вручную. Затем они запускаются во время установки приложения с помощью ANT. Для обновлений программа установки приложений просто применяет сценарии обновления к базе данных.
Чтобы улучшить управление обновлениями баз данных, я смотрел Flyway и Liquibase. Кажется, что я почти делаю то, что хочу, (в сторону: я предпочитаю Flyway на данный момент из-за всех существующих SQL/DDL-скриптов). Проблема, которую я вижу, заключается в том, что они одновременно обновляют базу данных. Это нормально для многих установок, но не для всех.
Что мне нужно сделать, так это запустить Flyway/Liquibase против базы данных и создать обновление script, которое включает в себя все обновления, необходимые для обновления базы данных - включая любые изменения, которые Flyway/Liquibase необходимо сделать самостоятельно столы. Это позволило бы мне (или, что еще важнее, администратору базы данных) запустить обновление script вне приложения (ов) для обновления базы данных. Затем я мог использовать Flyway/Liquibase в своем приложении, чтобы убедиться, что база данных обновлена.
Можно ли это сделать с помощью Flyway или Liquibase или любого другого инструмента?
Ответы
Ответ 1
Liquibase справляется с этим довольно хорошо. Он просматривает вашу базу данных в текущем состоянии, находит непримененные изменения и генерирует команду SQL script с update
в режиме sql output.
Использование надлежащего инструмента миграции базы данных вместо генератора Hibernate - это способ пойти в любом случае, рано или поздно вы столкнетесь с ситуацией, которую Hibernate не поддерживает. Для нас он сбросил уникальный индекс и заменил его другим. Вы также можете включить hibernate.hbm2ddl.auto=validate
, чтобы чувствовать себя в безопасности относительно совместимости между структурой базы данных и объектом beans.
Ответ 2
Что вам нужно, это инструмент сравнения схем. Я помню, что у TOAD был довольно мощный. Hibernate также попытается сгенерировать сценарии обновления схемы на основе обнаруженных им объектов и метаданных базы данных.
Однако вам нужно..., чтобы не делать этого и вместо этого использовать Flyway, чтобы все изменения в базе данных. То есть вам следует включить автоматические обновления схем Hibernates и самостоятельно написать обновления схемы. Каждый раз, когда вы хотите внести изменения в базу данных, вам нужно написать обновление схемы.
Некоторые люди захватывают вывод SQL о том, как обновлять схему спящего режима в качестве способа получения обновлений эволюции схемы. Проблема в том, что спящий режим обычно неверен, особенно если добавить столбец @NotNull
.
Также с точки зрения вашего администратора, я считаю, что Flyway может выводить на основе своей таблицы schema_version и сценариев миграции SQL/Java выход SQL, который он запускает, таким образом, ваш администратор базы данных может запускать его за пределами Flyway (если это не так, легкая возможность добавить).
Ответ 3
У нас была аналогичная проблема, когда я работал консультантом (Intelliware), поэтому разработчики собрали некоторый код и подтолкнули его к GitHub.
Мы безуспешно пытались включить его в основной репозиторий Flyway.
https://github.com/Intelliware/flyway-script-generator
Ответ 4
Да, создание SQL script является встроенной функцией для Liquibase. Другая область, в которой Liquibase имеет преимущество перед пролетным мостом, - это возможность миграции изменений кода базы данных (пакетов, процедур и функций). Я использую пролет, но мне бы хотелось, чтобы эти функции Liquibase были доступны на пролете.