故事
好久没写博客了,最近自己放松了不少,想想还是应该坚持下去,毕竟是自己选择的路,今天为什么写 flyway,因为目前 flyway 作为数据库迁移工具,确实很好用,目前应该也有很多公司采用 flyway 对数据库的 sql 版本进行管理。
我所在公司也是一样,虽然直接建表很方便,但是当项目进行多租户部署的时候,就会出现数据库错乱导致程序异常情况,除此之外,上线的系统也会涉及数据库的相关修改,这个时候,采用 flyway 对数据库版本进行管理。在方便自己的同时也方便别人。
flyway 是什么
刚刚的一个故事可能很多人还没明白,flyway 是什么。
通俗点说:flyway 就是在对数据库进行操作时候的版本管理工具
采用 flyway 能够很好的对数据库版本进行响应管理,多人协同操作,也不会造成错乱现象。
如何使用
flyway 是 java 环境中数据库版本控制工具之一,针对目前现状来说,常在 spring 系列框架中使用,接下来以 springboot 为例进行讲解。
在创建 Spring 项目,项目初始化时候选择 flyway 依赖
项目创建完后你会看见 resources 资源目录下会有 db/migration 目录,该目录用于存放 sql 文件。如下图所示。
同时你也会看见相关依赖
<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 脚本。大概内容如下:
这里需要说一下 sql 文件的命名方式
命名基本遵循以上三种方式,采用前缀 + 版本 + 描述 + 后缀构成
为什么会是这样呢?因为启动项目时候,flyway 会在数据库中生成默认的版本记录表,大概是这样:
flyway 默认生成的 log 表为:flyway_schema_history 也可以自己在 yml 文件中进行配置自定义表名
每当我们在 db/migration 目录下添加一个 sql 文件,启动项目后就会在 flyway_schema_history 表中添加一条记录,而记录的内容就是根据 sql 文件的命名进行添加的。
大概样子就是这样。其中 version 与 description 就是 sql 文件划分出来的
重点
1、sql 的版本需要严格递增
例如上个一个版本是 V1.0 那么下一个版本只能是 V1.01 或者 V1.1.0 或者 V 2.0.1 之类的,因为 flyway 在启动时候会去 flyway_schema_history 检测是否有已存在的记录,如果有就不在执行,如果没有就执行然后添加记录,这时候版本的命名对我们的管理就会很方便。
这里推荐 idea 插件 Flyway Migration Creation
安装插件后,每次在创建.sql 脚本时候,选中 db/migration 目录,然后右键 new 选择 Flyway Migration 然后选择第一个 Versioned migration,然后只需要输入 description 就可以,他会自动根据当前时间创建 version
- 在对.sql 脚本进行添加时候,每次都需要新增,千万别去改以前的 sql 文件,否则会导致创建失败
- 项目执行 60% 的错误都解决办法都是去 history 记录表中删除你所添加的这个版本号的记录,然后重新执行,剩下 20% 是你 sql 写错了,还剩下 20% 问 google 吧
flyway 常用功能
具体的以后再介绍吧,这里就入门以下就好了
flyway 常用 sql
- 创建表
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;
# 创建表
- 添加主键
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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于