Есть ли способ генерировать данные 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.