看看本身的项目的那些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
编辑当前目录下的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的代码放入项目中,并配置数据库,例如增长到默认生成的: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让咱们能很方便的管理数据库文件,并进行版本控制。文档地址