有没有办法以正确的顺序生成Liquibase数据?

时间:2014-05-06 06:46:47

标签: liquibase database-versioning

我使用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 个答案:

答案 0 :(得分:7)

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

在他们之后。

答案 1 :(得分:1)

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

您也可以随时重新排序更改日志。您应该考虑generateChangeLog的输出,以免您为现有数据库键入changeLog,如果不正确,修复生成的内容没有任何问题。 Liquibase的主要功能是跟踪已执行的chagneSets,因此对&#34;快照&#34;的限制。功能包括可能对生成的chagneSets进行排序。