5

我正在使用 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。

这可行,但问题是当我尝试运行那些生成的变更集时。我明白了

无法添加或更新子行:外键 ...',因为更改集的导出顺序未考虑外键。

我的问题是:是否有命令选项或可以按正确顺序生成变更集的东西,或者我应该手动重新排序变更集以获得所需的结果?

更新:

通常,外键应该是并且是在外键之后创建的。但是,在我们的系统中,核心应用程序创建了数据库的结构,并且多个客户端应用程序在同一个数据库中使用它们自己的私有数据填充数据库。而当我们生成数据时,数据变更集是按照数据库中表的字母顺序生成的,这可能是外键约束。我们设法手动安排变更集,但我想知道对于这种特殊情况是否有更好的解决方法。

4

2 回答 2

8

所以问题不在于更改类型的顺序(表,然后是数据,然后是 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>

在他们之后。

于 2014-05-21T15:22:08.897 回答
1

没有办法控制顺序。但是,它应该通过创建然后插入数据而不是创建外键来生成它。你运行的是最新的 3.1.1 版本吗?

您也可以随时重新排序更改日志。您应该考虑 generateChangeLog 的输出,因为您无需为现有数据库输入 changeLog ,并且如果生成的内容不完全正确,则修复生成的内容没有任何问题。Liquibase 的主要功能是跟踪执行的 chagneSet,因此对“快照”功能的限制也可能包括生成的 chagneSet 的排序。

于 2014-05-06T13:04:18.337 回答