Liquibase:组织变更日志的最佳实践

Posted

技术标签:

【中文标题】Liquibase:组织变更日志的最佳实践【英文标题】:Liquibase: best practices to organize changelogs 【发布时间】:2014-02-12 06:01:56 【问题描述】:

我几乎同意Liquibase Best Practices 中的每一句话,除了组织你的变更日志

我有两个主要目标要实现:

1) 在 application-7.0.0 上部署:

if not exists database 'app-db'
    create database 'app-db' using database-7.0.0.ddl
    sync database 'app-db' with changelog-7.0.0.xml
else
    update database 'app-db' with changelog-7.0.0.xml

2) 在 application-7.0.0 版本上:

for each X : version of application (except 7.0.0)
    create database 'test-source' using database-X.0.0.ddl
    sync database 'test-source' with changelog-X.0.0.xml
    update database 'test-source' with changelog-7.0.0.xml

    create database 'test-target' using database-7.0.0.ddl
    sync database 'test-target' with changelog-7.0.0.xml

    diff databases 'test-target' with 'test-source'
    if are not equals 
        throw ERROR

我知道这有点多余,但我想再次确定,也许你可以说服我(我希望如此)这没有必要。

对于第一个目标,使用主从策略来组织变更日志就足够了,但对于第二个目标则不然,因为我没有每个版本都有一个主控。

于是我想出了一个新的策略:

每个changelog.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.1.xsd">
    <include file="../2.0.0/changelog.xml"/>

    <changeSet author="Michele" id="3.0.0-1">
        <renameColumn tableName="PERSON" oldColumnName="NAME" newColumnName="FIRSTNAME" columnDataType="VARCHAR(255)"/>
    </changeSet>

    <changeSet author="Michele" id="3.0.0-2" >
        <addColumn tableName="PERSON">
            <column name="LASTNAME" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>

使用这种 递归 布局,每个变更日志文件都可以与同步/更新一起独立使用。

您有没有看到任何负面的方面或您有更好的策略?

我目前正在使用 JPA 2.1(eclipselink 2.5.0)、mysql 5.7、Liquibase 3.1.0、maven 3(和 glassfish 4.0)

【问题讨论】:

【参考方案1】:

如果每个版本的 changeLog 都包含对先前版本的 changelog 的引用,那么您所拥有的逻辑上与包含每个版本的主 changelog 相同。 Liquibase 将嵌套的变更日志扁平化为一个单一的变更集平面列表,然后按顺序执行每个。

对于您的模型,您必须更改针对每个新版本运行“更新”的 changelog.xml 文件,否则它的工作方式相同。

我不确定您的“使用 *.ddl 创建数据库”和“同步数据库”步骤的作用。您通常只需要对您的数据库运行 liquibase update 命令,liquibase 会跟踪哪些变更集已执行,并且只运行那些尚未将它们标记为已运行的变更集。

【讨论】:

使用 *.ddl 创建数据库,只需在 ddl 文件中批量执行语句即可创建表、键、ecc。同步数据库在新架构上使用 liquibase syncChangeLog。 但是我会更加努力地尝试并更新我的问题,因为使用这个模型,就像你说的那样,将执行重复更新

以上是关于Liquibase:组织变更日志的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

液化石油气。如何跟踪存储过程更改

java 导出 excel 最佳实践,大文件 excel 避免OOM(内存溢出) 框架-02-API

后端日志最佳实践

19 条 Node.js 生产环境中的最佳实践

Django 脚本组织的最佳实践

如何组织导航栏下方的“标签”?最佳实践?