UpdateSQL显然忽略了databasechangelog表的内容

时间:2017-01-26 15:26:55

标签: liquibase

我一直在开发应用程序的初始版本,并且数据库更改频繁,并且没有要保护的生产数据,因此我安装了LiquibaseServletListener并且它已经很好地更新/重新创建应用程序安装时需要DB。现在我们正在制作中,我需要从web.xml中删除它,这样我就可以确保仔细测试脚本,并且可以跟踪紧急更新,而无需重新部署整个应用程序等。

我的构建是gradle,我一直在使用liquibase-gradle插件,但我现在感到困惑的是,updateSQL似乎想写出整个脚本来创建数据库刮。

输出的SQL不包括liquibase表的创建,如果我关闭数据库,任务就会失败,所以它似乎确实正在读取数据库并知道该表,但我可以'似乎只获得了最近更改的SQL输出。

我希望它能够抱怨差异,或者认识到现有的254个变化......

ServletListener所做的更改是否有某种方式不等于gradle任务?

1 个答案:

答案 0 :(得分:4)

不确定这是否适用于此:Liquibase通过检查列idauthorfilename来检查是否已执行changeSet。

除非您在logicalFilePath标记中使用属性databaseChangeLog,否则Liquibase使用的实际文件名取决于运行Liquibase的进程的当前工作目录。

可能是您的文件名存储为例如通过Gradle执行时v1.0/filename.xml。但是当你从ServletListener运行它时,Liquibase“看到”的实际文件名可能是例如。 changelog/v1.0/filename.xml

如果我没有弄错的话,您可以通过查看databasechangelog生成的updateSQL生成的INSERT语句来验证我的理论。

我们习惯于始终指定logicalFilePath以确保Liquibase始终使用相同的文件名,无论其启动方式如何:

E.g。对于名为changelog_1.0.xml的文件,您需要使用:

<databaseChangeLog logicalFilePath="changelog_1.0.xml" ..... >
   .............
</databaseChangeLog>