我用 liquibase 管理我的数据库模式,我也想用 liquibase 管理演示数据。现在我正在寻找一个将两者结合在一起的好策略。
我的计划是向应该插入演示数据的变更集添加一个“演示数据”上下文。这行得通。如果我在另一个上下文中运行它们,它们将被忽略(如预期的那样)。
但我想要的是,它们也被标记为运行而不是被忽略。一般来说,这在有先决条件的情况下是可能的。但是我没有找到一种方法来根据上下文或标签进行前置条件。
你知道怎么做吗?
示例变更集:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
<changeSet author="me" id="1">
<createTable tableName="users">
<column name="id" type="Integer">
<constraints nullable="false" primaryKey="true" unique="true"/>
</column>
<column name="firstname" type="VARCHAR(255)">
<constraints nullable="false" />
</column>
<column name="lastname" type="VARCHAR(255)">
<constraints nullable="false" />
</column>
</createTable>
</changeSet>
<changeSet author="me" id="2" context="demo-data">
<preConditions onFail="MARK_RAN">
context = demo-data
</preConditions>
<insert tableName="users">
<column name="id" value="1"/>
<column name="firstname" value="Phil"/>
<column name="lastname" value="Harmony"/>
</insert>
</changeSet>
</databaseChangeLog>
如果我运行以下两个命令,我不想在数据库中有演示数据,因为这有可能在这两次运行之间更改数据库模式。而且我也想避免在任何时候意外添加旧的演示数据
liquibase update --contexts="any-non-existing-context" // Workaround for "everything except demo-data"
liquibase update --contexts="demo-data"
是的,
contex
不在支持的先决条件列表中,但您可以编写自己的自定义先决条件,该条件将使用提供的值对名为 context
的参数执行检查:
<preConditions>
<customPrecondition className="com.example.ContextPrecondition">
<param name="context" value="demo-data"/>
</customPrecondition>
</preConditions>
查看 Liquibase 文档中的这个示例,了解如何实现自定义前提条件https://contribute.liquibase.com/extensions-integrations/extension-guides/add-a-precondition/