liquibase 前提条件的最佳实践
Best practices on liquibase preConditions
我正在寻找有关何时在 Liquibase changeSet
中使用 preConditions
的最佳实践。
我知道它有助于检查数据库的现有状态,然后应用更改。
如果我打算从一开始就使用 Liquibase,并且所有更改都将通过 Liquibase 完成,难道 changeSet
不足以 check/validate 现有状态吗?在这种情况下,写 preConditions
在我看来更多余。我没能找到任何好的文档。
在我的用例中,我将使用 Liquibase 进行数据库模式更改 + 在几个 table 中添加元数据。
我看到一些数据库架构更改查询的示例,例如添加 table、列等,其中使用了 preConditions
。
但在正常的插入、更新、删除查询周围看不到太多。为此类数据操作查询编写 preConditions
也是一种好习惯吗?有什么好的文档吗?
是 - 你应该写前提条件。在每个变更集上。总是。你的 changeSets 应该是原子的,所以为它们编写前提条件应该一点也不难。只是需要一点自制力。
否 - changeSet id 不足以 check/validate 现有状态。在理想的世界中,这可能就足够了,那里的一切 运行 都非常顺利,没有错误,也没有人用 肮脏的 手来弄乱数据库。或者有人可以在您的数据库 ChangeLog 和理想流程的中间插入一些其他的变更集,仅基于变更集的顺序和标识将被破坏。
但是我们的世界并不理想,所以没有,changeSet的ID是不够的。你需要先决条件。
此外,如果您想了解有关如何确定变更集身份的更多信息,请查看此 。
回答关于在执行插入、更新和删除查询之前检查数据的问题的第二部分:
您可以随时使用 <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>
由于“最佳实践”类型的问题很少有单一的正确答案,我将添加自己的答案。
我的公司运行一个单一的整体应用程序,并且使用 liquibase 进行变更管理已有 5 年多了。我们是一个由 4 名开发人员组成的团队,已经在 100 多台服务器上部署了我们的应用程序。我们从不使用先决条件,而且我不记得曾经遇到过先决条件会有所帮助的液基问题。另一方面,除了通过 liquibase 之外,我们非常勤奋地不进行数据库更改,因为我们依赖于这个假设。
只要确保每个人都在同一页面上,你应该没问题。
注意:我在调查先决条件时发现了这个问题,因为我们正在编写另一个将共享单体架构的一部分的应用程序。因为变更日志将在逻辑上分布在多个独立发展的项目中,我们的假设可能不再成立。如果您计划在多个项目之间共享数据库,请记住这一点。
我正在寻找有关何时在 Liquibase changeSet
中使用 preConditions
的最佳实践。
我知道它有助于检查数据库的现有状态,然后应用更改。
如果我打算从一开始就使用 Liquibase,并且所有更改都将通过 Liquibase 完成,难道 changeSet
不足以 check/validate 现有状态吗?在这种情况下,写 preConditions
在我看来更多余。我没能找到任何好的文档。
在我的用例中,我将使用 Liquibase 进行数据库模式更改 + 在几个 table 中添加元数据。
我看到一些数据库架构更改查询的示例,例如添加 table、列等,其中使用了 preConditions
。
但在正常的插入、更新、删除查询周围看不到太多。为此类数据操作查询编写 preConditions
也是一种好习惯吗?有什么好的文档吗?
是 - 你应该写前提条件。在每个变更集上。总是。你的 changeSets 应该是原子的,所以为它们编写前提条件应该一点也不难。只是需要一点自制力。
否 - changeSet id 不足以 check/validate 现有状态。在理想的世界中,这可能就足够了,那里的一切 运行 都非常顺利,没有错误,也没有人用 肮脏的 手来弄乱数据库。或者有人可以在您的数据库 ChangeLog 和理想流程的中间插入一些其他的变更集,仅基于变更集的顺序和标识将被破坏。
但是我们的世界并不理想,所以没有,changeSet的ID是不够的。你需要先决条件。
此外,如果您想了解有关如何确定变更集身份的更多信息,请查看此
回答关于在执行插入、更新和删除查询之前检查数据的问题的第二部分:
您可以随时使用 <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>
由于“最佳实践”类型的问题很少有单一的正确答案,我将添加自己的答案。
我的公司运行一个单一的整体应用程序,并且使用 liquibase 进行变更管理已有 5 年多了。我们是一个由 4 名开发人员组成的团队,已经在 100 多台服务器上部署了我们的应用程序。我们从不使用先决条件,而且我不记得曾经遇到过先决条件会有所帮助的液基问题。另一方面,除了通过 liquibase 之外,我们非常勤奋地不进行数据库更改,因为我们依赖于这个假设。
只要确保每个人都在同一页面上,你应该没问题。
注意:我在调查先决条件时发现了这个问题,因为我们正在编写另一个将共享单体架构的一部分的应用程序。因为变更日志将在逻辑上分布在多个独立发展的项目中,我们的假设可能不再成立。如果您计划在多个项目之间共享数据库,请记住这一点。