如何解决我可以指定一个 mysql 数据库,其中某些 liquibase 变更集应该只执行还是应该创建一个包含所需变更集的新文件
考虑我有多个数据库 DB1 和 DB2。两个变更集都必须是 在 DB1 中执行,但 id="12" 仅在 DB2 中执行。
以下是我使用的变更集格式 db-install.xml。有没有更好的办法。
<changeSet id="11" author="root">
<sql> <![CDATA[
INSERT INTO 'DB1.item_status` (`id`,`status`)
VALUES
(1,'added'),(2,'sold'),(3,'unsold'),(4,'updated');
]]>
</sql>
</changeSet>
<changeSet id="12" author="root">
<sql> <![CDATA[
INSERT INTO `item_details` (`id`,`state`)
VALUES
(1,'Very Strong'),'Strong'),'Medium'),'Faint'),(5,'None');
]]>
</sql>
</changeSet>
解决方法
我相信 Liquibase Contexts 正是您所需要的,并且会帮助您。
让我们假设您有 2 个上下文,分别是“DB1”和“DB2”。还假设您的项目中有以下两个变更集:
<changeSet id="11" author="root" context="DB1,DB2">
<sql> <![CDATA[
INSERT INTO 'DB1.item_status` (`id`,`status`)
VALUES
(1,'added'),(2,'sold'),(3,'unsold'),(4,'updated');
]]>
</sql>
</changeSet>
<changeSet id="12" author="root" context="DB1">
<sql> <![CDATA[
INSERT INTO `item_details` (`id`,`state`)
VALUES
(1,'Very Strong'),'Strong'),'Medium'),'Faint'),(5,'None');
]]>
</sql>
</changeSet>
假设您正在使用以下命令运行 liquibase:
liquibase --changeLogFile=changelog.xml --contexts="DB2" update
在运行 liquibase 时指定上下文 DB2 将仅运行其上下文具有“DB2”作为值的变更集。在上面的示例中,带有 id=11 的变更集具有 "DB2" 上下文,但是带有 id=12 的变更集没有 "DB2" 作为上下文值。因此,在运行 liquibase 时,id=12 的变更集只会在您提供上下文值“DB1” 时执行。
请阅读 this link,其中详细解释了 liquibase 上下文及其用途。
干杯!