Во-первых: я использую весеннюю загрузку 2.0.3.RELEASE с liquibase 3.5.5
Если я правильно понимаю:
- Liquibase запускается до инициализации Hibernate
- Liquibase запускается до создания пружинных бобов
- Liquibase идеально подходит для манипуляций с db-схемой
Проблема, с которой я сталкиваюсь, заключается в том, как сделать данные-migrations ....
Например: у меня есть 8 довольно сложных таблиц, связанных друг с другом (несколько внешних ключей и таблицы перекрестных ссылок).Я хочу заполнить эти таблицы автоматизированным способом.
Требования:
- Заполнение / манипулирование должны быть автоматизированы (каждая среда должна иметь одинаковые данные, сразу послезапуск)
- Заполнение / манипулирование должно происходить в соответствии со сценариями liquibase (когда позднее изменяется схема db, эти сценарии не должны завершиться сбоем)
Пока что я 'Мы использовали 2 подхода:
CustomTaskChange
из liquibase, но эти классы не имеют доступа к среде Spring, поэтому я написал много ручных и сложных SQL-запросов и повторно использовал полученные идентификаторы и т. д.. - Ручные запросы / вызовы API при выпуске, но это очень подвержено ошибкам, рискованно и медленно.(у нас есть облачная служба, поэтому, пока все запросы не будут выполнены, сервер находится в несовместимом состоянии)
Я не думаю, что смогу подключить среду Spring, потому что конфигурация приложения и пружиныеще не завершено в этот момент.По крайней мере: кажется, что Hibernate еще не загружен, как вы можете видеть из журналов:
INFO 50668 --- [ost-startStop-1] liquibase : Successfully acquired change log lock
INFO 50668 --- [ost-startStop-1] liquibase : Reading from public.databasechangelog
INFO 50668 --- [ost-startStop-1] liquibase : classpath:/db/changelog/db.changelog-master.yaml: classpath:/db/changelog/db.changelog-master.yaml::test: Table test created
INFO 50668 --- [ost-startStop-1] liquibase : classpath:/db/changelog/db.changelog-master.yaml: classpath:/db/changelog/db.changelog-master.yaml::test: ChangeSet classpath:/db/changelog/db.changelog-master.yaml::test: ran successfully in 53ms
INFO 50668 --- [ost-startStop-1] liquibase : Successfully released change log lock
INFO 50668 --- [ost-startStop-1] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
INFO 50668 --- [ost-startStop-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
INFO 50668 --- [ost-startStop-1] org.hibernate.Version : HHH000412: Hibernate Core {5.2.17.Final}
INFO 50668 --- [ost-startStop-1] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
INFO 50668 --- [ost-startStop-1] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
INFO 50668 --- [ost-startStop-1] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
Этого следовало ожидать, так как liquibase должен обновить схему, прежде чем сущности смогут соответствовать ей.
Итак ... Каковы наилучшие методы для реализации этого?
Существует ли инструмент, который взаимодействует с liquibase / spring-boot для управления манипуляциями с данными?
Лучше простоделать это вручную каждый выпуск?
Редактировать:
Чем больше я думаю об этом, тем больше я понимаю, что это совершенно невозможно ... Вам нужно настроитьвесенний контекст для того единственного сценария, которому это нужно, и уничтожить его впоследствии.Но если ваши сущности не совпадают с версией скрипта, он рухнет ... Поэтому вам нужно будет вернуть кодовую базу к коду, когда скрипт был написан, или создать сущности на лету на основе текущей схемы DB ...