我正在将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(调试方法)解决此类问题的任何建议。
答案 0 :(得分:3)
这可能是由不同的“工作目录”引起的。根据环境,Liquibase以不同方式解析更改日志的文件名。由于文件名是表databasechangelog
中唯一键的一部分,Liquibase可能认为尚未执行特定的changeSet。
如果您检查filename
中的databasechangelog
列,则可能会看到不同的值,具体取决于您运行更改日志的环境。
我们通过将属性logicaFilePath
添加到每个XML文件的changeLog
标记来解决此问题。该值是纯文件名,其中没有任何目录。
类似的东西:
<databaseChangeLog
xmlns="...."
xmlns:xsi="..."
xsi:schemaLocation="...."
logicalFilePath="changelog_v1.xml">