由于在使用Libreplan时依赖了LiquiBase,故简单记录下LiquiBase的使用。

一、简介

LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,之后可以执行日志文件中的修改(UpdateRollback等),将数据库更新或回滚到一致的状态。

二、安装

  • 安装Java

  • 下载Liquibase并解压

  • 下载数据库驱动

    此处以H2为例,下载H2 JDBC Driver,将H2/bin目录下的h2*.jar复制到Liquibase的解压目录

  • 配置liquibase.properties

    在Liquibase的解压目录下创建liquibase.properties文件并添加以下内容:

      driver: org.h2.Driver
      classpath: ./h2-1.4.199.jar
      url: jdbc:h2:file:./h2tutorial
      username: admin
      password: password
      changeLogFile: myChangeLog.xml
    

三、入门

1、脚本方式

  • 创建SQL目录

在Liquibase的解压目录下创建sql目录来放置Liquibase用来跟踪和部署等的SQL脚本文件。

  • 创建ChangeLog配置文件

在Liquibase的解压目录下创建ChangeLog的配置文件:myChangeLog.xml,在此配置文件中配置SQL脚本所在目录,内容如下:

<?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"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

  <includeAll path="/sql"/>
</databaseChangeLog>
  • 添加SQL脚本

Liquibase会按sql目录中的脚本字母数字顺序排序执行。在sql目录下创建001_create_person_table.sql文件,内容如下:

create table PERSON (
    ID int primary key,
    FNAME varchar(100) not null,
);
  • 部署

在命令行中切换到当前目录下执行liquibase.bat update

  • 检查结果

双击H2安装目录下的bin/h2.bat启动H2客户端,输入前面配置的用户名和密码(admin/password),可以看到成功的创建出了PERSON表。

2、Liquibase模式

此种方式下Liquibase将根据定义的changeSet生成SQL,并将其部署到目标数据库。所有改动将在changeLog文件中显式的跟踪和排序。

  • 创建ChangeLog配置文件

同样,在Liquibase的解压目录下创建ChangeLog的配置文件:myChangeLog.xml,内容如下:

<?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"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

</databaseChangeLog>
  • 添加changeSet

每个changeSet通过idauthor属性来唯一标识。这两个标记以及changeLog文件的名称与包名标识唯一的更改。

每个changeSet被当作一个应用于数据库的原子操作,通常情况下,最好在changeSet中只包含一个更改操作;也允许包含多个,例如插入多行的场景,此种情况下也应该作为单个事务。Liquibase将尝试将每个changeSet作为单个事务运行,但很多数据库默认对某些命令(例如:create tabledrop table等)提交并重新开始事务。

<?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"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <changeSet id="1" author="bob">
        <createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="boolean" defaultValueBoolean="true"/>
        </createTable>
    </changeSet>

</databaseChangeLog>
  • 部署

在命令行中切换到当前目录下执行liquibase.bat update

  • 检查结果

同样,在H2客户端中可以看到DEPARTMENT表创建成功:

参考资料: