Flyway简介及使用

1、简介

1.1 Flyway是什么?

Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。 Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置。 Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等。 同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。

关于FlywayHomepage - Flyway

1.2为什么要使用Flyway

在真实的项目开发中,我们每个人都会有一个应用软件和与其相联系的数据库。对于个人开发来说,这样就够了。但是,项目开发一般都不止一个人,因此一定会出现我在我的本地有一套软件和相应的数据库系统,我的另一个同事会在他的本地有一套他自己的软件和相应的数据库系统。我们需要面临的第一个问题就是我们两个人如何集成我们的数据库系统,之后还要处理如何将数据库系统迁移到测试环境和生产环境当中去。


1.3 flyway工作原理

一言以蔽之:flyway通过历史记录表(flyway_schema_history)来记录版本历史。每次随项目启动时将会自动扫描在resources/db/migration下的文件并查询flyway_schema_history判断是否为新增文件。如果是新增的文件,则执行该迁移文件。如果不是,则忽略。

当flyway在一个空数据库执行时,它将直接创建一张默认名为flyway_schema_history的数据记录为空的历史记录表,这张表将被用来跟踪或记录数据库的状态。尔后flyway将会开始扫描文档系统或项目classpath路径下的迁移文件。

在这里插入图片描述

flyway按版本号顺序排列迁移文件,并按序执行,并更新历史记录表中的内容:

在这里插入图片描述

当项目再次发版时,flyway会再次扫描迁移文件,然后将迁移文的版本号与历史记录表中的版本号进行对比。flyway会忽略版本号小于等于表中当前最大版本的迁移文件,剩余待执行迁移文件会按版本号升序执行。(译者注:并非真正忽略,而是会校验checksum值是否一致,以此来保证历史版本文件未被篡改。)

在这里插入图片描述

历史记录表变动如下:

在这里插入图片描述

所以每次当你打算升级数据库时(包含DDL、DML语句),只需要在指定路径下创建一个版本号大于历史记录表中当前最大的版本号的迁移文件即可。在下次flyway启动时(随项目启动或其他形式),数据库将会自动完成升级,你无须再手动执行脚本。

2、使用

2.1 集成Spring Boot

2.1.1 创建Migration目录

在工程的 src/main/resources 目录下创建db/migration目录(Flyway加载Migrations时的默认Locations)

2.1.2 Maven配置:pom文件添加依赖

  1. <dependency>
  2. <groupId>org.flywaydb</groupId>
  3. <artifactId>flyway-core</artifactId>
  4. <version>${flyway.version}</version>
  5. </dependency>

2.1.3 项目配置文件(yml)

  1. spring:
  2. # 数据库连接配置
  3. datasource:
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
  6. username: root
  7. password: root
  8. flyway:
  9. # 是否启用flyway
  10. enabled: true
  11. # 编码格式,默认UTF-8
  12. encoding: UTF-8
  13. # 迁移sql脚本文件存放路径,默认db/migration
  14. locations: classpath:db/migration
  15. # 迁移sql脚本文件名称的前缀,默认V
  16. sql-migration-prefix: V
  17. # 迁移sql脚本文件名称的分隔符,默认2个下划线__
  18. sql-migration-separator: __
  19. # 迁移sql脚本文件名称的后缀
  20. sql-migration-suffixes: .sql
  21. # 迁移时是否进行校验,默认true
  22. validate-on-migrate: true
  23. # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
  24. baseline-on-migrate: true
flyway配置详解

flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.

2.1.4 添加需要运行的sql脚本

sql脚本的命名一定要规范,否则运行flyway会报错,命名规则主要有两种:

  1. 仅需要被执行一次的SQL命名以大写的"V"开头,V+版本号(版本号的数字间以”.“或”_“分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名。例如:  V20201100__create_user.sql、V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql。
  2. 可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。(不推荐使用)比如: R__truncate_user_dml.sql 。

其中,V开头的SQL执行优先级要比R开头的SQL优先级高。

Spring Boot 将会自动管理Flyway的启动和运行。然后Flyway会默认在你的项目的CLASSPATH路径下的db/migration目录下(在我们的项目一般就是src/main/resources/db/migration里面)查找SQL脚本。将你的SQL脚本写完然后放入此路径下后就可以运行你的项目,Spring会自动创建Flyway的Bean来处理你的脚本。

posted @ 2022-08-29 15:37  edda_huang  阅读(759)  评论(0编辑  收藏  举报