Liquibase:如何识别仅更改集的基础 ID?

Liquibase: How to identify change set only basis ID?

根据 liquibase 文档:

Each changeSet tag is uniquely identified by the combination of the “id” tag, the “author” tag, and the changelog file classpath name.

这似乎是一个非常糟糕的设计选择。变更集的身份不应与其位置相关联。如果更改日志是 运行 通过自动应用程序部署,则更改集将来自 JAR 文件中的类路径位置。如果我想从命令行手动 运行 相同的变更集,位置可能是当前目录。

在这种情况下,liquibase 不会根据其 ID 将变更集识别为相同,而是会尝试应用它两次。 有没有办法改变这种行为并让它仅根据指定的 ID 识别变更集?

仅当您操纵源代码并重新编译您自己的 liquibase 版本时。

其实设计的很好,只是你用错了。 如果你G。有一个大团队,每个团队在单独的 liquibase 文件中维护他们的变更集,不考虑文件名将是致命的,因为不同的团队可以使用相同的 ID。

只需确保您始终以相同的方式调用 Liquibase,并且变更集的身份不会改变。

我建议使用 databaseChangeLog 标签的 logicalFilePath 属性。

这使您可以更自由地更改项目的目录结构。 它还可以防止文件名存储为绝对路径(在某些情况下可能会发生)。

@binoternary 的回答有效。但问题是 logicalFilePath 仅在 XML 变更集中可用,而我使用的是 SQL 变更集。解决方法是创建一个 XML 变更集,然后像这样将 SQL 包含在其中:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">

    <changeSet id="new-tables" author="kshitiz" logicalFilePath="new_tables.sql">
        <sqlFile path="new_tables.sql" relativeToChangelogFile="true" />
    </changeSet>
</databaseChangeLog>