SpringBoot项目集成Flyway进行数据库版本控制

Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。

项目组开发时遇到的数据库难题

项目代码同步可以通过git等工具管理起来,数据库理想情况下,在开发新项目的时候会首先把业务理清楚,把数据库表设计好,然后将
数据库交给专门的人员维护,但实际情况下,需求一直在变,数据库都是大家在改在操作,团队沟通效率等问题,导致数据库变更不能
及时地同步,这样就很有可能会出现项目开发完了整理时发现大家都改了同一个表的尴尬局面,然后又得返回去重新修改。很容易出
错,所以急需要一个数据库版本管理工具,将数据库版本管理像开发代码一样管理起来。

Flyway 的优势

1、不仅支持sql 脚本,还支持Java 代码直接操作数据库(flyway-core-x.x.x.jar);
2、有Maven 插件;
3、支持命令行;
4、与Spring 框结合,很方便地实现应用启动时自动检查并升级数据库的功能(最重要)。

Flyway的简单介绍

社区版本、企业版本支持
https://flywaydb.org/download/
概念
Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像SVN管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
支持的数据库类型
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。
SQL脚本的命名规范
V+版本号(版本号的数字间以".“或”_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,例如:V1.0.0.201908270946__Update.sql。
注意:版本号不能相同!
Flyway读取sql脚本的默认位置
项目的源文件夹下的db/migration目录。

下面就一起来看一下,怎么把Flyway集成到SpringBoot项目中吧!

第一步:pom.xml添加maven依赖(也可以通过直接导入Jar包的方式实现)



	org.flywaydb
	flyway-core
	5.0.7

第二步:开启Flyway支持,在application.properties文件添加Flyway配置

# FLYWAY (FlywayProperties)
flyway.baseline-version=1.0.0
flyway.enabled=true
flyway.sql-migration-prefix=V
flyway.sql-migration-suffix=.sql
flyway.baselineOnMigrate=true
flyway.location=db/migration

flyway.baseline-version 执行基线时用来标记已有Schema的版本。默认为1,可以根据需要设置,设为1.0.0这样。
flyway.enabled 开启Flyway。默认为true。
flyway.sql-migration-prefix SQL迁移的文件名前缀。默认为V,可以不配置。
flyway.sql-migration-suffix SQL迁移的文件名后缀。默认为.sql,可以不配置。
flyway.baselineOnMigrate 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线。这个一定要设置为true,他的意思是将数据库原有的表、数据作为基线,然后在此基础上进行操作。以后若sql脚本太多了,可以在代码库中归档sql到服务器上,然后删掉数据库中的"schema_version"表,然后部署项目,flyway会自动初始化原有的数据库表作为基线,后续版本控制可以从V1.0.1开始。
flyway.location 迁移脚本的位置。默认为db/migration,也可以自己配置脚本存放位置。

第三步:在resource目录下创建db/migration目录添加sql脚本

SpringBoot项目集成Flyway进行数据库版本控制_第1张图片

验证是否成功:项目启动时,会运行flyway执行sql语句.生成schema_version表,用于记录sql执行情况.

在这里插入图片描述
当sql文件修改后.比如多个空格,项目启动时,该sql对应的checksum字段与表记录的不一致会报错。所以不要随意删除flyway.location下的sql脚本,若需要删除归档,需要先把对应数据库中schema_version表删除,检查下是否配置了flyway.baselineOnMigrate=true。

处理Flyway 更新数据库和代码逻辑操作数据库时的冲突(自己目前没遇到,网上找到的,先留着备不时之需):

如果Flyway 还在更新数据库,没有完成更新操作之前,应用程序的其他逻辑已经开始使用数据库进行其他操作了,会导致应用程序产生很多bug ,甚至根本运行不起来。要解决这个问题,我们可以利用Spring 的bean 依赖原理,让关键的数据库操作bean 依赖于flywayMigration 这个bean ,达到在flywayMigration 没有实例化完成(数据库更新操作完成)之前,不能进行任何其他数据库相关操作。

 
		

当数据库脚本文件太多时,可以在db/migration文件夹下建文件夹进行归档。

SpringBoot项目集成Flyway进行数据库版本控制_第2张图片
也可以在创建脚本的时候,直接创建文件夹存放的方式。
SpringBoot项目集成Flyway进行数据库版本控制_第3张图片
执行顺利通过版本来控制。

你可能感兴趣的:(数据库,flyway)