首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构Liquibase changelog文件

重构Liquibase changelog文件
EN

Stack Overflow用户
提问于 2013-09-12 23:01:09
回答 3查看 7.7K关注 0票数 7

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

旧的结构:

代码语言:javascript
复制
/db/changesets-from-beginning-of-time.xml

新结构:

代码语言:javascript
复制
/db/changesets/changesets-from-beginning-of-time.xml
/db/changesets/changesets-v.1.2.3.xml
/db/changesets/changeset-master.xml

changesets-* -files的内容只是changeset xml,而changeset-master.xml文件看起来像这样:

代码语言:javascript
复制
<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设置并清空我的数据库?

EN

回答 3

Stack Overflow用户

发布于 2013-09-13 19:40:08

在liquibase上还有一种叫做"logicalFilePath"的东西,它被描述为:

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

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

(但这不适用于格式化的sql文件。参见Liquibase Jira中的issue: CORE-915

票数 11
EN

Stack Overflow用户

发布于 2015-12-23 04:08:58

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

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

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

上游开发者建议直接更新DATABASECHANGELOG.FILENAME列,用全路径修复损坏的条目。

如果您设置了在下次运行LiquiBase时触发散列重新计算的散列DATABASECHANGELOG.MD5SUMnull。您应该这样做,因为哈希算法在计算时使用所有复合ID部分。

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

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<changeSet author="admin" id="fix-25" logicalFilePath="fix.xml">
   ...
</changeSet>

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

代码语言:javascript
复制
--liquibase formatted sql  logicalFilePath:legacy.sql

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

代码语言:javascript
复制
--changeset db-maint:tune-indexed  logicalFilePath:other.sql

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

代码语言:javascript
复制
mvn liquibase:changelogSyncSQL

并回顾一下migration.sql。对应的pom.xml部件:

代码语言:javascript
复制
<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>
票数 7
EN

Stack Overflow用户

发布于 2013-09-13 08:38:04

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18767815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档