【问题标题】:UpdateSQL apparently ignoring contents of databasechangelog tableUpdateSQL 显然忽略了 databasechangelog 表的内容
【发布时间】:2017-01-26 23:59:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: liquibase


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 是的,就是这样。谢谢!作为对未来读者的附加说明,在 XML 中设置的值对应于 databasechangelog 表的“文件名”列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    相关资源
    最近更新 更多