官网 Flyway是一款管理并跟踪数据库迁移(migrate)的数据库版本管理工具

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

在群里看到有人说了这个,就看了下

  • 对 jpa 用处不大,但是这个可以清晰的看见版本的更迭和历史sql

Demo使用

创建一个项目

数据库随便 数据库操作工具随便

image.png

引入 flyway 依赖

  1. <!--引入flyway-->
  2. <dependency>
  3. <groupId>org.flywaydb</groupId>
  4. <artifactId>flyway-core</artifactId>
  5. <version>6.1.0</version>
  6. <!--<version>7.8.2</version> 2021.05.08目前最新版本-->
  7. </dependency>

简单配置

  1. ## application.properties
  2. ##server.port=1234
  3. ##spring.jpa.show-sql=true
  4. ##spring.datasource.url=jdbc:mysql://192.168.0.3:3306/flyway
  5. ##spring.datasource.password=root
  6. ##spring.datasource.username=root
  7. ##spring.profiles.active=flyway
  8. ## https://zhuanlan.zhihu.com/p/304110137
  9. spring:
  10. flyway:
  11. # 是否启用flyway
  12. enabled: true
  13. # 编码格式,默认UTF-8
  14. encoding: UTF-8
  15. # 迁移sql脚本文件存放路径,默认db/migration
  16. locations: classpath:db/migration
  17. # 迁移sql脚本文件名称的前缀,默认V
  18. sql-migration-prefix: V
  19. # 迁移sql脚本文件名称的分隔符,默认2个下划线__
  20. sql-migration-separator: __
  21. # 迁移sql脚本文件名称的后缀
  22. sql-migration-suffixes: .sql
  23. # 迁移时是否进行校验,默认true
  24. validate-on-migrate: true
  25. # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
  26. baseline-on-migrate: true

开始使用

resources`` 目录下新增目录 db/migration

  • 默认是 db/migration
  • 可以自定义
    • 配置文件中: spring.flyway.locations 属性

新建一个SQL**就代表一个版本

  • V版本号__描述.sql
    • V是根据 sql-migration-prefix中的设置
    • .sql 是根据 sql-migration-suffixes中的设置
    • __ 是根据 sql-migration-separator 中的设置
  1. 新建 SQL
    1. 来一个测试的创建sql
  2. 测试版本更新
    1. 来一个新增字段的sql
  3. 在测试下版本更新
    1. 来一个删表的sql

      我的测试sql

      image.png

  • v.1 创建表 ```sql

    文件名解释 V版本号__描述

    create table flyway.tb_user( id INT NOT NULL AUTO_INCREMENT, user_name VARCHAR(100) NOT NULL, nick_name VARCHAR(40) NOT NULL, create_date DATETIME default CURRENT_TIMESTAMP comment ‘创建时间’, PRIMARY KEY ( id ) );

INSERT INTO flyway.tb_user (user_name, nick_name) VALUES ( ‘谭^’, ‘谭^’);

  1. - v.2 新增字段
  2. ```sql
  3. ## 文件名解释 V版本号__描述
  4. ALTER TABLE `tb_user`
  5. ADD COLUMN `sex` int(4) NOT NULL DEFAULT 1 COMMENT '0:未知,1:男,2:女。目前为止只有两个状态' AFTER `nick_name`;
  6. INSERT INTO `tb_user` (`user_name`, `nick_name`) VALUES ( '谭^1', '谭^1');
  • v.3 删除表 ```sql

    文件名解释 V版本号__描述

    drop table tb_user;

```

使用注意

success 为 0 的时候

flyway 脚本执行失败的话会导致服务启动失败,success 为 0 的时候,修改正确之后不会重新加载脚本,需要删掉flyway记录表的那条数据。

Error creating bean with name ‘flywayInitializer’ defined in class path resource

image.png image.png image.png