Java敏捷数据库迁移框架——Flyway

Flyway Logo

看看本身的项目的那些SQL文件或者干脆连个建表语句都没有的同窗是否会有想法把他们管理起来呢?向你们推荐一款很是轻量级的敏捷数据库迁移框架——Flyway。想知道她有什么魅力吗?html

Flyway为你们提供了以下的实现方式:java

  • Java APImysql

  • 命令行sql

  • Maven数据库

  • Gradleapache

  • Antsegmentfault

  • SBTapi

为了减小描述难度在这里使用了Java API,项目构建方式为Maven,数据库为MySQLoracle

须要环境

建立项目

首先咱们要在命令行中使用Maven原型插件执行以下命令

mvn archetype:generate -B \
        -DarchetypeGroupId=org.apache.maven.archetypes \
        -DarchetypeArtifactId=maven-archetype-quickstart \
        -DarchetypeVersion=1.1 \
        -DgroupId=foo \
        -DartifactId=bar \
        -Dversion=1.0-SNAPSHOT \
        -Dpackage=foobar

咱们已经准备好开始了。当前项目的结构以下

.
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- foobar
    |           `-- App.java
    `-- test
        `-- java
            `-- foobar
                `-- AppTest.java

进入建立的项目

cd bar

增长Flyway依赖

编辑当前目录下的pom.xml,增长Flyway和MySQL的依赖

<project ...>
    ...
    <dependencies>
        <dependency>
            <groupId>com.googlecode.flyway</groupId>
            <artifactId>flyway-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        ...
    </dependencies>
    ...
</project>

整合Flyway

如今咱们能够将Flyway的代码放入项目中,并配置数据库,例如增长到默认生成的:src/main/java/foobar/App.java

package foobar;

import com.googlecode.flyway.core.Flyway;

public class App {
    public static void main(String[] args) {
        // 建立Flyway实例
        Flyway flyway = new Flyway();

        // 设置数据库
        flyway.setDataSource("jdbc:mysql://localhost:3306/foobar", "user", "pass");

        // 开始迁移
        flyway.migrate();
    }
}

建立第一个数据迁移

建立数据迁移目录src/main/resources/db/migration,执行命令

mkdir -p src/main/resources/db/migration

建立咱们的第一个数据迁移src/main/resources/db/migration/V1__Create_person_table.sql

CREATE TABLE person (
    id INT,
    name VARCHAR(100)
);

执行程序

执行App.java(也能够直接在IDE中执行main方法)

mvn package exec:java -Dexec.mainClass=foobar.App -Dmaven.test.skip=true

若是你成功了,应该会获得以下信息

INFO: Creating Metadata table: `foobar`.`schema_version`
Feb 27, 2014 12:20:18 AM com.googlecode.flyway.core.command.DbMigrate migrate
INFO: Current version of schema `foobar`: << Empty Schema >>
Feb 27, 2014 12:20:18 AM com.googlecode.flyway.core.command.DbMigrate applyMigration
INFO: Migrating schema `foobar` to version 1
Feb 27, 2014 12:20:18 AM com.googlecode.flyway.core.command.DbMigrate logSummary
INFO: Successfully applied 1 migration to schema `foobar` (execution time 00:00.194s).

持续增长数据迁移

假如咱们如今须要增长第二个数据迁移,命名为:src/main/resources/db/migration/V2__Add_people.sql

INSERT INTO person (id, name) VALUES (1, 'Axel');
INSERT INTO person (id, name) VALUES (2, 'Mr. Foo');
INSERT INTO person (id, name) VALUES (3, 'Ms. Bar');

执行命令

mvn package exec:java -Dexec.mainClass=foobar.App -Dmaven.test.skip=true

输出以下

Feb 27, 2014 12:25:00 AM com.googlecode.flyway.core.command.DbMigrate migrate
INFO: Current version of schema `foobar`: 1
Feb 27, 2014 12:25:00 AM com.googlecode.flyway.core.command.DbMigrate applyMigration
INFO: Migrating schema `foobar` to version 2
Feb 27, 2014 12:25:00 AM com.googlecode.flyway.core.command.DbMigrate logSummary
INFO: Successfully applied 1 migration to schema `foobar` (execution time 00:00.047s).

总结

经过Flyway让咱们能很方便的管理数据库文件,并进行版本控制。文档地址

相关文章
相关标签/搜索