Есть ли способ генерировать данные Liquibase в правильном порядке?

Я использую Liquibase для управления версиями существующей базы данных, поэтому я использую

liquibase \
  --logLevel=debug \
  --driver=com.mysql.jdbc.Driver \
  --classpath=lib/mysql-connector-java-5.1.30.jar \
  --url="jdbc:mysql://127.0.0.1:3306/schema" \
  --username=user \
  --password=pass \
  --diffTypes="data" \
  --changeLogFile="./data.xml" generateChangeLog

для генерации ревизии xml.

Это работает, но проблема в том, когда я пытаюсь запустить эти сгенерированные наборы изменений. я получил

Невозможно добавить или обновить дочернюю строку: внешний ключ...', поскольку в экспортированном порядке набора изменений не учитываются внешние ключи.

Мой вопрос: есть ли опция команды или что-то, что может генерировать набор изменений в правильном порядке, или я должен вручную изменить порядок наборов изменений, чтобы получить желаемый результат?

Обновить:

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

2 ответа

Решение

Таким образом, проблема не в порядке типов изменений (таблицы, затем данные, затем FK), а в том, что вы используете только сгенерированные вставки данных с существующей таблицей и структурой FK? Liquibase даже не пытается выяснить, как ряды зависят друг от друга, поскольку это становится практически невозможным в общем случае.

Самое простое решение - отключить проверки FK перед вставкой и повторно включить их после. Как вы это сделаете, зависит от вашей базы данных, но вы можете включить что-то вроде:

<changeSet id="disable-keys" author="x" runAlways="true">
    <sql>SET FOREIGN_KEY_CHECKS=0;</sql>
</changeSet>

до вашего <insert> теги и

<changeSet id="enable-keys" author="x" runAlways="true">
    <sql>SET FOREIGN_KEY_CHECKS=1;</sql>
</changeSet>

после них.

Нет способа контролировать порядок. Тем не менее, он должен генерировать его с созданием, а затем вставкой данных, а не созданием внешнего ключа. Вы используете новейшую версию 3.1.1?

Вы также всегда можете изменить порядок изменений. Вы должны рассматривать вывод generateChangeLog как спасающий вас от ввода changeLog для существующей базы данных, и нет ничего плохого в исправлении того, что было сгенерировано, если оно не совсем правильно. Основная функциональность Liquibase - отслеживание выполненных наборов chagneSets, а также ограничения функциональности "моментальных снимков", включая, возможно, упорядочение сгенерированных наборов chagneSets.

Другие вопросы по тегам