使用CLI和Maven时Liquibase的行为不同

时间:2015-10-21 15:28:42

标签: postgresql maven liquibase

我正在将Liquibase整合到现有项目中。我使用CLI从数据库生成更改日志并执行 changeLogSync 。我确认 databasechangelog 表包含生成的日志中的数据。

当我尝试从CLI中生成的更改日志更新数据库时:

liquibase --changeLogFile=changeLog.xml --url="jdbc:postgresql://database_server:port/database --defaultSchemaName=public update

导致Liquibase Update Successful

当我尝试在inMaven中做同样的事情时,它失败了: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 中使用前置条件来防止创建一个存在的表,但我认为它更好地修复了Maven配置。

为什么CLI和Maven执行之间存在差异?我还要感谢有关如何使用Maven / Liquibase(调试方法)解决此类问题的任何建议。

1 个答案:

答案 0 :(得分:3)

这可能是由不同的“工作目录”引起的。根据环境,Liquibase以不同方式解析更改日志的文件名。由于文件名是表databasechangelog中唯一键的一部分,Liquibase可能认为尚未执行特定的changeSet。

如果您检查filename中的databasechangelog列,则可能会看到不同的值,具体取决于您运行更改日志的环境。

我们通过将属性logicaFilePath添加到每个XML文件的changeLog标记来解决此问题。该值是纯文件名,其中没有任何目录。

类似的东西:

<databaseChangeLog 
     xmlns="...." 
     xmlns:xsi="..." 
     xsi:schemaLocation="...."
     logicalFilePath="changelog_v1.xml">