8

我们正在为我正在处理的这个项目使用Liquibase ,所有的变更日志都在一个大的 XML 文件中。不幸的是,这个文件变得太大了——我们想要引入一个“主”文件,其中包括原始文件和任何新文件。

旧结构:

/db/changesets-from-beginning-of-time.xml

新结构:

/db/changesets/changesets-from-beginning-of-time.xml
/db/changesets/changesets-v.1.2.3.xml
/db/changesets/changeset-master.xml

-files的内容changesets-*只是变更集 xml,而changeset-master.xml文件如下所示:

<databaseChangeLog xmlns="...skipped...">
    <include file="changesets-from-beginning-of-time.xml" 
              relativeToChangelogFile="true"/>
    <include file="changesets-v1.2.3.xml" 
              relativeToChangelogFile="true"/>
</databaseChangeLog>

现在,DATABASECHANGELOG我的数据库中的表引用了旧文件,因此旧的变更集再次运行。

根据Liquibase 文档,每个变更集都由组合唯一标识[filepath/-name]:::[id]:::[author]- 这对我来说不是最佳的。

所以我的问题是 - 如何在不破坏 liquibase 设置和清空数据库的情况下重构文件结构?

4

3 回答 3

12

liquibase 上还有一个叫做“logicalFilePath”的东西,它被描述为:

用于在创建变更集的唯一标识符时覆盖文件名和路径。移动或重命名更改日志时需要。

也许这有帮助。如果我没记错的话,这个选项允许不包含标识符的完整文件路径。

(但这不适用于格式化的 sql 文件。请参阅问题: Liquibase Jira 中的 CORE-915。

于 2013-09-13T11:40:07.870 回答
8

我喜欢指出上游和用户之间的旧对话:

http://forum.liquibase.org/topic/why-does-the-change-log-contain-the-file-name

我认为上游论点很弱,他们做出了在完整文件路径上中继的愚蠢决定。最初的想法是您通过修复文件路径,CLASSPATH但您的请求表明这也是错误的。

上游开发人员建议对DATABASECHANGELOG.FILENAME列执行直接更新以修复具有完整路径的损坏条目。

如果您将哈希DATABASECHANGELOG.MD5SUM设置null为该值,则会在下一次 LiquiBase 运行时触发哈希重新计算。您应该这样做,因为哈希算法使用文件路径作为输入。

logicalFilePath可以应用于顶级 XML 标记:

<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"
                   logicalFilePath="legacy.xml">
    ...
</databaseChangeLog>

或者可能被每个变更集覆盖:

<changeSet author="admin" id="fix-25" logicalFilePath="fix.xml">
   ...
</changeSet>

SQL 语法还具有logicalFilePath顶级文件标记的属性(在 v3.3 中实现):

--liquibase formatted sql  logicalFilePath:legacy.sql

并且可以在每个变更集标记中被覆盖::

--changeset db-maint:tune-indexed  logicalFilePath:other.sql

为了验证设置是否有效,我使用:

mvn liquibase:changelogSyncSQL

和审查migration.sql。对应pom.xml部分:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <configuration>
        <changeLogFile>${basedir}/src/main/resources/sql/master.xml</changeLogFile>
        <propertyFile>${liquibase.profile}</propertyFile>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>

        <migrationSqlOutputFile>migration.sql</migrationSqlOutputFile>
    </configuration>
</plugin>
于 2015-12-22T20:08:57.740 回答
4

Liquibase 有一个“changelogSync”命令,可用于将变更集标记为在数据库中执行。

于 2013-09-13T00:38:04.350 回答