Xml 重构Liquibase变更日志文件

Xml 重构Liquibase变更日志文件,xml,database,liquibase,Xml,Database,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文件中。不幸的是,这个文件太大了——我们想引入一个“主”文件,包括原始文件和任何新文件

旧结构:

/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
新结构:

/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
表引用了旧文件,因此旧的变更集将再次运行

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


所以我的问题是-如何重构文件结构而不破坏我的liquibase设置并清空我的数据库?

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

还有一个叫做liquibase的东西,描述为:

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

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


(但这不适用于格式化的sql文件。请参阅Liquibase Jira中的内容。

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

我认为上游参数很弱,它们会做出愚蠢的决定来传递完整的文件路径。最初的想法是通过
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 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>

org.liquibase
liquibase maven插件
${liquibase.version}
${basedir}/src/main/resources/sql/master.xml
${liquibase.profile}
假的
migration.sql

在这个博客上对如何使用logicalFilePath进行了很好的描述:针对v3.3关闭的SQL语法错误!