zoukankan      html  css  js  c++  java
  • Flyway对比Liquibase(转)

    数据库迁移工具.

    很多应用的运行是需要数据库支持的,而随着快速迭代,产品更替的节奏加快,除了产品本身需要不断更新以外,数据库也需要做出合适的管理了。

    为什么需要数据库迁移管理

    比如第一个版本的产品只包含了最基本的功能,而第二版本就需要增加评论功能,这就涉及到数据结构的修改(包括创建新表,修改旧表的列,增加已有表的列等等)。直接进入产品数据库修改数据库并不适合快速的开发节奏,不仅仅不安全,更多的情况下数据库可能并不对外或者并不适合对外直接暴露连接,比如PAAS平台的数据库以服务的形式直接提供。

    对比代码管理的一些实践,很明显在数据库方面做的还欠缺很多。比如代码管理中我们有

    • 版本管理(svn,git等等)
    • 持续集成技术
    • 良好的发布工具和流程

    而在数据库方面会遇到很多问题

    • 某台数据库现在是什么状态
    • 修改变更的脚本是否已经应用
    • 对于生产环境的紧急修复有没有被应用在测试环境
    • 如何创建一个新的数据库实例

    数据库迁移工具可以很好的管理这些问题,并提供了以下特性

     

     

     

    • 从迁移脚本中创建新的数据库
    • 检查数据库状态
    • 从一个版本快速到达另外一个版本

     Flyway和Liquibase

    数据库迁移工具很多,这里我们选择Flyway和Liquibase来说主要是两个原因,一是它们都是Java生态圈的,其次就是Spring Boot提供了这两者的内建支持,可以很快应用到产品中。

    Flyway相对简单,直接将你需要执行的SQL语句保存为文件,放入应用中执行即可。比如

    Flyway的好处在于简单,而且直接书写SQL并不需要额外的学习。

    Liquibase相对就复杂了很多,它支持四种格式

    • xml
    • json
    • yaml
    • sql

    如果使用过Flyway就会有一定的体会,Flyway的简单是有代价的,举个简单的例子,如果我们开发环境是h2数据库,而测试环境和产品环境是MySQL,这里就有一个问题,SQL语句并不是一个广泛兼容的语言,有些关键字是独有的,而我们并不希望放弃这部分功能。这种情况下你就需要书写两套SQL迁移文件。Spring Boot是内建这种支持的,可以从目录上做区分。

    而Liquibase可以根据数据库的情况为你生成最后的迁移语句,同时因为数据库变动首先是被Liquibase解析,所以也可以简单支持回滚。

    来看一个Liquibase的例子,以XML为例,我个人觉得yaml更简洁,但是经常有对齐的问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="UTF-8"?>
     
    <databaseChangeLog
            xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
            xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
            http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
        <changeSet id="1" author="nvoxland">
            <createTable tableName="person">
                <column name="id" type="int" autoIncrement="true">
                    <constraints primaryKey="true" nullable="false"/>
                </column>
                <column name="firstname" type="varchar(50)"/>
                <column name="lastname" type="varchar(50)">
                    <constraints nullable="false"/>
                </column>
                <column name="state" type="char(2)"/>
            </createTable>
        </changeSet>
        <changeSet id="2" author="nvoxland">
            <addColumn tableName="person">
                <column name="username" type="varchar(8)"/>
            </addColumn>
            <addLookupTable
                existingTableName="person" existingColumnName="state"
                newTableName="state" newColumnName="id" newColumnDataType="char(2)"/>
        </changeSet>
    </databaseChangeLog>

    Liquibase支持大部分常见的数据库变动操作,比如建表,删表,变动字段等等。

    Liquibase可以在不使用SQL的情况下造成数据库变动,其可读性更高一些,特别是团队并不直接使用SQL而整体相关知识储备不完善的情况下优势更明显。

    结论

    两款数据库迁移工具其实定位上是差别的,一般我的倾向是小项目,整体变动不大的用Flyway,而大应用和企业应用用Liquibase更合适。

    转自:https://blog.csdn.net/WillPan1234/article/details/80509861

  • 相关阅读:
    Mac上面Mov转gif
    iOS crash日志分析
    Markdown 学习笔记
    Homebrew安装和使用
    XCode 出现 is missing from working copy文件一直红色情况解决方法
    Mac上面用来录屏的软件(录制gif图片或者mov)
    (十七)Hibnernate 和 Spring 整合
    (十六)Hibernate中的延迟加载
    (十五)Hibernate中的多表操作(5):双向多对多
    (十四)Hibernate中的多表操作(4):单向一对一
  • 原文地址:https://www.cnblogs.com/muxi0407/p/11741958.html
Copyright © 2011-2022 走看看