写在前面
在日常开发中,经常遇到数据库变更,字段增减调整,需要维护多个不同数据库时是十分痛苦的事情.代码可以使用 svn,git 等工具进行管理,那么数据库的版本可以使用 Flyway 一款小工具,就可以大大简化这方面的工作。官方网站
介绍
flyway 支持大部分主流的数据库,Oracle,SQL Server MySQL 等;
并且拥有命令行工具,Maven,Gradle 插件等;
配置简单,实用方便,支持 Sql 及 java 配置,这里写一个简单的 java 配置。
需要明白的几个概念:
- 版本:对数据库的每一次变更可称为一个版本。
- 迁移:Flyway 把数据库结构从一个版本更新到另一个版本叫做迁移。
- 可用的迁移:Flyway 的文件系统识别出来的迁移版本。
- 已经应用的迁移:Flyway 已经对数据库执行过的迁移。
使用
-
需要使用 Flyway 核心 jar 包;可直接下载 flyway-core-3.2.1.jar。
-
在项目中创建文件夹 src/dbmigration, 默认 src/db/migration,可以在配置中进行修改。
-
对 Flyway 进行数据库配置,这里使用 spring 配置文件配置,也可以使用 java 对象进行配置,
<bean id="flyway" class="org.flywaydb.core.Flyway" init-method=”migrate”>
<property name=”dataSource” ref=”dataSource” /> <!--数据源-->
<property name=”locations” value=”dbmigration”/> <!--脚本文件夹地址 默认src/db/migration-->
<property name=”validateOnMigrate” value=”false”/> <!--迁移验证 默认true-->
<property name=”baselineOnMigrate” value=”true”/> <!--基线迁移 默认false-->
<property name=”placeholderPrefix” value=”ignore”/> <!--占位符前缀-->
<property name=”outOfOrder” value=”false”/>
</bean>
<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean” depends-on=”flyway”> <!--建立前置依赖-->
<property name=”configLocation” value=”classpath:/conf/configuration.xml”/>
<property name=”dataSource” ref=”dataSource” /> <!--数据源-->
</bean>
然后,就完成了简单配置了,在 dbmigration 文件夹下创建 sql 文件,比如:V1_0_1__初始化.sql,V1_0_2__修改表.sql 等,其中 sql 脚本文件需要按照一定的规则来命名,能够让 flyway 检测并执行。
命名规则也能进行定义比如 prefix、separator、suffix,默认 prefix 是 V(执行一遍,并且版本号唯一,如果有重复就会报错)或 R(重复执行,不需要版本号),separator 是双下划线__,suffix 是.sql。V 开头 + 版本号 + 双下划线 + 描述。
新版本更改脚本,版本数字大于之前的版本就可以了。
注意
在启动 tomcat 启动后 加载配置文件运行 flyway 组件 对数据库版本更新,它在维护更新时会在数据库中新建表 schame_version 用来对 sql 脚本版本升级进行维护,一份 sql 文件对应一条数据,所以对数据库版本升级时,会根据该表查询进行操作,如果没有记录,则会执行该 sql 文件,如果存在数据则不执行,在对当前数据库中 sql 脚本只会执行一次,
如果出现异常例如:org.flywaydb.core.api.FlywayException: Schema "xxx" contains a failed migration to version 1.1.043 !则表示数据库冲突,需要把表 schame_version 相应记录删除,并且保证 sql 脚本操作不会与该数据库冲突。每次版本更新 schame_version 都会保存运行的结果。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于