Spring-boot + liquibase: сложная обработка данных / миграция / заполнение - PullRequest
0 голосов
/ 29 ноября 2018

Во-первых: я использую весеннюю загрузку 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 ...

...