使用 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">