我一直在开发应用程序的初始版本,并且数据库更改频繁,并且没有要保护的生产数据,因此我安装了LiquibaseServletListener
并且它已经很好地更新/重新创建应用程序安装时需要DB。现在我们正在制作中,我需要从web.xml中删除它,这样我就可以确保仔细测试脚本,并且可以跟踪紧急更新,而无需重新部署整个应用程序等。
我的构建是gradle,我一直在使用liquibase-gradle插件,但我现在感到困惑的是,updateSQL似乎想写出整个脚本来创建数据库刮。
输出的SQL不包括liquibase表的创建,如果我关闭数据库,任务就会失败,所以它似乎确实正在读取数据库并知道该表,但我可以'似乎只获得了最近更改的SQL输出。
我希望它能够抱怨差异,或者认识到现有的254个变化......
ServletListener所做的更改是否有某种方式不等于gradle任务?
答案 0 :(得分:4)
不确定这是否适用于此:Liquibase通过检查列id
,author
和filename
来检查是否已执行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>