使用 CLI 和 Maven 时 Liquibase 的不同行为
Liquibase different behavior when using CLI and Maven
我正在将 Liquibase 集成到现有项目中。我使用 CLI 从数据库生成更改日志并执行 changeLogSync。我验证了 databasechangelog table 包含来自生成日志的数据。
当我尝试从 CLI 中生成的更改日志更新数据库时:
liquibase --changeLogFile=changeLog.xml --url="jdbc:postgresql://database_server:port/database --defaultSchemaName=public update
结果为 Liquibase Update Successful
。
当我尝试在 Maven 中做同样的事情时,它失败了:Failed to execute goal org.liquibase ... Error setting up or running Liquibase: Migaration failed for change set ... Reason: liquibase.exception.DatabaException: ERROR: relation already exists.
请注意,我没有修改changeLog.xml文件,我已经执行了changeLogSync,所以更新预计什么都不做,但在使用 Maven 时它会尝试创建所有关系。
Maven 配置具有以下结构:
<configuration>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<propertyFile>liquibase.properties</propertyFile>
<defaultSchemaName>public</defaultSchemaName>
</configuration>
<executions>
<execution>
<id>update</id>
<phase>pre-integration-test</phase>
<goals>
<goal>updateSQL</goal>
<goal>update</goal>
</goals>
</execution>
</executions>
和 liquibase.properties 文件包含其余参数,这些参数与 CLI 命令中的参数相同。
liquibase 版本:3.4.1
postgresql 版本:9.4-1201-jdbc41
我知道我可以在 changeLog.xml 中使用先决条件来防止创建存在的 table 但我认为在设计上最好修复行家配置。
为什么 CLI 和 Maven 执行之间存在差异?对于如何使用 Maven/Liquibase(调试方法)解决此类问题的任何建议,我也将不胜感激。
这可能是 "working directories" 不同造成的。根据环境的不同,Liquibase 会以不同方式解析变更日志的文件名。由于文件名是 table databasechangelog
中唯一键的一部分,Liquibase 可能认为尚未执行特定的变更集。
如果您检查 databasechangelog
中的 filename
列,您可能会看到不同的值,这取决于您 运行 更改日志所在的环境。
我们通过将属性 logicaFilePath
添加到每个 XML 文件的 changeLog
标签来解决这个问题。该值是其中没有任何目录的普通文件名。
类似于:
<databaseChangeLog
xmlns="...."
xmlns:xsi="..."
xsi:schemaLocation="...."
logicalFilePath="changelog_v1.xml">
我正在将 Liquibase 集成到现有项目中。我使用 CLI 从数据库生成更改日志并执行 changeLogSync。我验证了 databasechangelog table 包含来自生成日志的数据。
当我尝试从 CLI 中生成的更改日志更新数据库时:
liquibase --changeLogFile=changeLog.xml --url="jdbc:postgresql://database_server:port/database --defaultSchemaName=public update
结果为 Liquibase Update Successful
。
当我尝试在 Maven 中做同样的事情时,它失败了:Failed to execute goal org.liquibase ... Error setting up or running Liquibase: Migaration failed for change set ... Reason: liquibase.exception.DatabaException: ERROR: relation already exists.
请注意,我没有修改changeLog.xml文件,我已经执行了changeLogSync,所以更新预计什么都不做,但在使用 Maven 时它会尝试创建所有关系。
Maven 配置具有以下结构:
<configuration>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<propertyFile>liquibase.properties</propertyFile>
<defaultSchemaName>public</defaultSchemaName>
</configuration>
<executions>
<execution>
<id>update</id>
<phase>pre-integration-test</phase>
<goals>
<goal>updateSQL</goal>
<goal>update</goal>
</goals>
</execution>
</executions>
和 liquibase.properties 文件包含其余参数,这些参数与 CLI 命令中的参数相同。
liquibase 版本:3.4.1 postgresql 版本:9.4-1201-jdbc41
我知道我可以在 changeLog.xml 中使用先决条件来防止创建存在的 table 但我认为在设计上最好修复行家配置。
为什么 CLI 和 Maven 执行之间存在差异?对于如何使用 Maven/Liquibase(调试方法)解决此类问题的任何建议,我也将不胜感激。
这可能是 "working directories" 不同造成的。根据环境的不同,Liquibase 会以不同方式解析变更日志的文件名。由于文件名是 table databasechangelog
中唯一键的一部分,Liquibase 可能认为尚未执行特定的变更集。
如果您检查 databasechangelog
中的 filename
列,您可能会看到不同的值,这取决于您 运行 更改日志所在的环境。
我们通过将属性 logicaFilePath
添加到每个 XML 文件的 changeLog
标签来解决这个问题。该值是其中没有任何目录的普通文件名。
类似于:
<databaseChangeLog
xmlns="...."
xmlns:xsi="..."
xsi:schemaLocation="...."
logicalFilePath="changelog_v1.xml">