首页 > 解决方案 > liquibase preConditions 的最佳实践

问题描述

我正在寻找何时preConditions在 Liquibase中使用的最佳实践changeSet。我了解它有助于检查数据库的现有状态然后应用更改的事实。如果我要从一开始就使用 Liquibase 并且所有更改都将通过 Liquibase 完成,这changeSet不足以检查/验证现有状态吗?在这种情况下,写作preConditions在我看来更加多余。我还没有找到任何好的文件。

在我的用例中,我将使用 Liquibase 进行数据库架构更改 + 在几个表中添加元数据。我看到了一些数据库模式更改查询的示例,例如添加表、列等preConditions已使用的地方。但在正常的插入、更新、删除查询方面看不到太多。preConditions为此类数据操作查询编写也是一种好习惯吗?有什么好的文档吗?

标签: javadatabaseliquibase

解决方案


的 - 你应该写前置条件。在每一个变更集上。总是。您的变更集应该是原子的,因此为它们编写前置条件一点也不难。只需要一点点自制力。

- changeSet id 不足以检查/验证现有状态。在理想的世界中,一切都运行得非常顺利,没有错误,没有人用他们的脏手弄乱数据库,这可能就足够了。或者有人可以在您的 databaseChangeLog 和理想流程中间插入一些其他的 changeSet,仅基于 changeSets 的顺序和身份将被破坏。

但是我们的世界并不理想,所以No,changeSet 的 ID 是不够的。你需要前置条件。

另外,如果您想了解有关如何确定 changeSet 的身份的更多信息,请查看此问题。


要回答关于在执行插入、更新和删除查询之前检查数据的问题的第二部分:

您可以随时使用<sqlCheck>标签。

<changeSet id="foo" author="bar">
    <preConditions onFail="MARK_RAN">
        <sqlCheck expectedResult="0">
            SELECT COUNT(*) FROM user WHERE full_name='John Doe';
        </sqlCheck>
    </preConditions>
    <sql>
       <!-- your custom SQL query here which modifies data somehow -->
    </sql>
</changeSet>

推荐阅读