Flyway的简单介绍及使用详解
一、开发时管理数据库遇到的问题:
现在开发一般都是团队开发,这样就会出现项目同步的问题,代码同步可以通过svn工具管理起来,那数据库同步怎么办呢?理想的情况下,在开发新项目的时候会首先把业务理清楚,把数据库表设计好,然后将数据库交给专门的人员维护,也就不存在数据库同步的问题了。但实际情况呢?需求从项目开始到项目结束一直在变,很多公司就没有专门的数据库维护人员,数据库大家都在操作,都在修改,如果团队之间沟通及时还好,大家每次更新代码后顺便也更新一下数据库,如果沟通不及时,呵呵(大家自行脑补)。。。这样数据库不同步的问题就凸显出来了。
二、flyway 的简单介绍:
1、概念:
flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,flyway可以像svn管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
2、支持的数据库类型:
oracle, sql server, sql azure, db2, db2 z/os, mysql (including amazon rds), mariadb, google cloud sql, postgresql (including amazon rds and heroku), redshift, vertica, h2, hsql, derby, sqlite, sap hana, soliddb, sybase ase and phoenix。
3、sql脚本的命名规范:
v+版本号(版本号的数字间以"."或"_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,例如:v2017.9.30__update.sql。
注:版本号不能相同!
4、flyway读取sql脚本的默认位置:
项目的源文件夹下的db/migration目录。
5、指令:
一共就6个基本指令:migrate、clean、info、validate、baseline、repair。
三、flyway 的优势:
1、不仅支持sql 脚本,还支持java 代码直接操作数据库(flyway-core-x.x.x.jar);
2、有maven 插件;
3、支持命令行;
4、与spring 框结合,很方便地实现应用启动时自动检查并升级数据库的功能。
四、flyway命令行工具的使用:
1、解压下载flyway-commandlin 版本并解压到本地,结构图如下:
2、将sql脚本放在flyway默认的db/migration目录下,如果放在其他位置需要修改conf/flyway.conf文件中的flyway.locations。
3、根据自己的情况修改conf/flyway.conf文件中的flyway.url、flyway.user、flyway.password。
4、在命令行执行migrate命令。
五、与maven项目结合使用:
1、引入依赖坐标:
<!-- flyway --> <dependency> <groupid>org.flywaydb</groupid> <artifactid>flyway-core</artifactid> <version>4.2.0</version> <dependency>
2、在src/main/resources目录下建立存放sql版本文件的路径database/sqlite(也可以写默认路径db/migration),并将sql文件放在下面。
3、增加flyway的java类:
package com.xxxxxx.flyway; import javax.sql.datasource; import org.flywaydb.core.flyway; public class migrationsqlite { private datasource datasource; public void setdatasource(datasource datasource) { this.datasource = datasource; } public void migrate() { //初始化flyway类 flyway flyway = new flyway(); //设置加载数据库的相关配置信息 flyway.setdatasource(datasource); //设置存放flyway metadata数据的表名,默认"schema_version",可不写 flyway.settable("schma_version"); //设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径,默认"db/migration",可不写 flyway.setlocations("database/sqlite"); //设置sql脚本文件的编码,默认"utf-8",可不写 flyway.setencoding("utf-8"); flyway.migrate(); } }
4、在spring中实例化第3步的java类:
<bean id="migrationsqlite" class="com.xxxxxx.flyway.migrationsqlite" init-method="migrate"> <property name="datasource" ref="datasource"></property> </bean>
从上面的bean 定义中我们可以看到,我们为flywaymigration 这个bean 实例注入了一个数据源,flyway 的所有操作将针对这个数据源进行;同时我们通过init-method 属性指定了spring 在实例化该bean 以后,主动执行该bean 的migrate 方法,而该方法内会执行flyway 更新数据库的操作。至此,我们达到了在应用启动时,spring 实例化上下文的时候,在spring 实例化flywaymigration 这个bean 的时候,自动执行flyway 更新数据库的操作。
5、处理flyway 更新数据库和代码逻辑操作数据库时的冲突(自己目前没遇到,网上找到的,先留着备不时之需):
如果flyway 还在更新数据库,没有完成更新操作之前,应用程序的其他逻辑已经开始使用数据库进行其他操作了,会导致应用程序产生很多bug ,甚至根本运行不起来。要解决这个问题,我们可以利用spring 的bean 依赖原理,让关键的数据库操作bean 依赖于flywaymigration 这个bean ,达到在flywaymigration 没有实例化完成(数据库更新操作完成)之前,不能进行任何其他数据库相关操作。
<bean id="sessionfactory" class="org.springframework.orm.hibernate4.localsessionfactorybean" depends-on="migrationsqlite"> <property name="datasource" ref="datasource" /> </bean>
这样,每次启动项目时就会自动更新数据库,不必在为数据库不同步烦恼了。
参考文章:
1、 (官网)
2、
3、
4、
到此这篇关于flyway的简单介绍及使用的文章就介绍到这了,更多相关flyway的简单介绍及使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!