UpdateSQL 显然忽略了 databasechangelog 的内容 table

UpdateSQL apparently ignoring contents of databasechangelog table

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

我的构建在 gradle 中,我一直在使用 liquibase-gradle 插件,但我现在对 updateSQL 似乎想要的事实感到困惑写出整个脚本以从头开始创建数据库。

输出的SQL不包括liquibase tables的创建,如果我关闭数据库任务失败,所以看起来它确实在读取数据库并且知道 table,但我似乎无法获得仅包含最新更改的 sql 输出。

我希望它要么抱怨差异,要么识别 254 项现有更改...

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

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

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

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

如果我没记错的话,您可以通过查看作为 updateSQL 输出的一部分的 databasechangelog 生成的 INSERT 语句来验证我的理论。

我们已经养成了 总是 指定 logicalFilePath 的习惯,以确保 Liquibase 始终使用相同的文件名,而不管它的启动方式如何:

例如对于名为 changelog_1.0.xml 的文件,您需要使用:

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