【问题标题】:Is there a way to combine changeset in liquibase?有没有办法在 liquibase 中组合变更集?
【发布时间】:2016-05-10 04:24:36
【问题描述】:

假设需要向表中添加 2 列并修改 1。从纯设计视图中,我需要创建 3 个具有 3 个不同前提条件的变更集:2 列存在,1 列类型错误。

这是一种清晰的设计方法,但它会导致 3 个单独的 alter table,这可能非常昂贵。例如,当添加或修改列时,MySql 会复制或重建整个表。但它允许将几个修改过的语句合并为一个。但是一个变更集需要结合先决条件,这是不可能的——当其中一个为真或全部为真时,我应该执行大变更吗?

那么有没有办法查看几个先决条件并仅从成功的先决条件构造alter table?

【问题讨论】:

  • 关于先决条件的说明:您通常应该只依靠 Liquibase 的变更日志跟踪来了解是否已应用变更集。前提条件有时很有帮助,但如果您完全依赖它们来确定应该执行什么,那么数据库更改没有得到足够好的控制通常是一种“不良代码气味”。只需确保您仅使用先决条件进行隔离检查,以使数据库恢复正常。

标签: mysql sql liquibase changeset


【解决方案1】:

对于 MySQL,如果您有一个带有多个嵌套列的 addColumn 标记,它将生成一个一次性添加所有列的 ALTER TABLE 语句。

您可以在“and”和“or”块中嵌套多个前提条件,因此您可以使用一个 changeSet 来检查 column1 是否缺失且 column2 是否缺失,如果两者都缺失,则运行 addColumns 并列出两列。然后下一个 changeSet 可以检查丢失的 column1,下一个检查丢失的 column2,下一个检查错误的数据类型。

您需要将前提条件 onFail 属性设置为“MARK_RAN”,以便它们仅在运行时被标记,并且不会在每次更新时不断重新评估。

【讨论】:

  • 采用了同样的方法。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多