重构Liquibase changelog文件

时间:2013-09-12 15:01:09

标签: xml database liquibase

我正在使用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

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 documentation,每个变更集都由[filepath/-name]:::[id]:::[author]组合唯一标识 - 这对我来说不是最佳。

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

3 个答案:

答案 0 :(得分:10)

liquibase上还有一个名为"logicalFilePath"的东西,描述如下:

  

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

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

(但这对格式化的sql文件不起作用。请参阅Liquibase Jira中的issue: CORE-915

答案 1 :(得分:6)

我想指出上游与用户之间的旧对话:

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

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

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

如果您设置哈希值DATABASECHANGELOG.MD5SUM ot null,则会在下一次LiquiBase运行时触发哈希重新计算。您应该这样做,因为哈希算法在计算时使用所有复合ID部分。

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>

答案 2 :(得分:4)

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