flyway 简单入门使用

本贴最后更新于 1209 天前,其中的信息可能已经时移世改

故事

好久没写博客了,最近自己放松了不少,想想还是应该坚持下去,毕竟是自己选择的路,今天为什么写 flyway,因为目前 flyway 作为数据库迁移工具,确实很好用,目前应该也有很多公司采用 flyway 对数据库的 sql 版本进行管理。

我所在公司也是一样,虽然直接建表很方便,但是当项目进行多租户部署的时候,就会出现数据库错乱导致程序异常情况,除此之外,上线的系统也会涉及数据库的相关修改,这个时候,采用 flyway 对数据库版本进行管理。在方便自己的同时也方便别人。

flyway 是什么

刚刚的一个故事可能很多人还没明白,flyway 是什么。

通俗点说:flyway 就是在对数据库进行操作时候的版本管理工具

采用 flyway 能够很好的对数据库版本进行响应管理,多人协同操作,也不会造成错乱现象。

如何使用

flyway 是 java 环境中数据库版本控制工具之一,针对目前现状来说,常在 spring 系列框架中使用,接下来以 springboot 为例进行讲解。

在创建 Spring 项目,项目初始化时候选择 flyway 依赖

image.png

项目创建完后你会看见 resources 资源目录下会有 db/migration 目录,该目录用于存放 sql 文件。如下图所示。

image.png

同时你也会看见相关依赖

<dependency>
     <groupId>org.flywaydb</groupId>
     <artifactId>flyway-core</artifactId>
</dependency>

如果是已经生成的项目,后来需要加入 flyway 进行数据库版本管理,直接添加依赖,创建目录

截至目前依赖已经倒入,接下来就是配置 yml 配置文件

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flywaydemo
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

  flyway:
    enabled: true # 开启flyway
    # flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。
    clean-disabled: true
    locations: classpath:db/migration  #flyway文件目录
    table: flyway_schema_history  #历史表名
    baseline-on-migrate: true
    validate-on-migrate: true  #连续性校验
    baseline-version: 1 #指定默认版本
    encoding: UTF-8 #编码
    out-of-order: false # 是否允许不按顺序迁移 开发建议 true  生产建议 false
    sql-migration-prefix: V #前缀默认v
    sql-migration-separator: __ #分割符,默认__
    sql-migration-suffixes: .sql  #迁移文件,默认.sql


springboot 在创建项目时导入了 flyway,可以不配置 yml,采用默认构建

然后就可以开始在 db\migration 目录下开始写 sql 脚本。大概内容如下:

image.png

这里需要说一下 sql 文件的命名方式

image.png

命名基本遵循以上三种方式,采用前缀 + 版本 + 描述 + 后缀构成

为什么会是这样呢?因为启动项目时候,flyway 会在数据库中生成默认的版本记录表,大概是这样:

flyway 默认生成的 log 表为:flyway_schema_history 也可以自己在 yml 文件中进行配置自定义表名

image.png

每当我们在 db/migration 目录下添加一个 sql 文件,启动项目后就会在 flyway_schema_history 表中添加一条记录,而记录的内容就是根据 sql 文件的命名进行添加的。

image.png

大概样子就是这样。其中 version 与 description 就是 sql 文件划分出来的

重点

1、sql 的版本需要严格递增

例如上个一个版本是 V1.0 那么下一个版本只能是 V1.01 或者 V1.1.0 或者 V 2.0.1 之类的,因为 flyway 在启动时候会去 flyway_schema_history 检测是否有已存在的记录,如果有就不在执行,如果没有就执行然后添加记录,这时候版本的命名对我们的管理就会很方便。

这里推荐 idea 插件 Flyway Migration Creation

image.png

安装插件后,每次在创建.sql 脚本时候,选中 db/migration 目录,然后右键 new 选择 Flyway Migration 然后选择第一个 Versioned migration,然后只需要输入 description 就可以,他会自动根据当前时间创建 version

image.png

  1. 在对.sql 脚本进行添加时候,每次都需要新增,千万别去改以前的 sql 文件,否则会导致创建失败
  2. 项目执行 60% 的错误都解决办法都是去 history 记录表中删除你所添加的这个版本号的记录,然后重新执行,剩下 20% 是你 sql 写错了,还剩下 20% 问 google 吧

flyway 常用功能

image.png

具体的以后再介绍吧,这里就入门以下就好了

flyway 常用 sql

  1. 创建表
CREATE TABLE `user` (
   `id` int(11) DEFAULT NULL,
   `name` varchar(255) DEFAULT NULL,
   `sex` varchar(255) DEFAULT NULL,
   `detail` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 创建表
  1. 添加主键
ALTER TABLE `user`
    ADD CONSTRAINT PK_user PRIMARY KEY (id)

#添加主键
#ALTER TABLE `表名`  ADD CONSTRAINT PK_表名 PRIMARY KEY (字段名)

3.移除主键

Alter table `user` drop primary key

#Alter table 表名 drop primary key

4.添加主键自增

alter table  `user`  modify id int auto_increment primary key

# 主键自增
#alter table  tableName  modify id int auto_increment primary key

5.移除主键自增

alter table `user` modify id int(11),drop primary key;

#重置为普通列
#alter table class modify id int(11),drop primary key;


6.添加列

ALTER TABLE `user` ADD ppid bigint

# 添加列 ALTER TABLE `user` ADD ppid bigint

7.删除列

ALTER TABLE `user` DROP COLUMN ppid

#移除表中的列

8.改变列属性

alter table `user` modify column `sex` varchar(20) DEFAULT NULL

9.添加注释

ALTER TABLE `user` COMMENT '用户表';
ALTER TABLE `user` MODIFY COLUMN sex tinyint(1) COMMENT '性别';
#表注释
#ALTER TABLE userinfo COMMENT '用户信息资料表';

# 字段注释
#ALTER TABLE userinfo MODIFY COLUMN uname VARCHAR(40) COMMENT '姓名';

更多的相关东西参见官网 doc

也可以去看看这个大佬的博客

https://blog.csdn.net/chenleiking/article/details/80691750

sql 相关的语句可以去 w3school 里看看

https://www.w3school.com.cn/sql/sql_alter.asp

flyway 的学习 demo

flywaydemo.zip

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    332 引用 • 619 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...