flyway简单入门使用
故事
好久没写博客了,最近自己放松了不少,想想还是应该坚持下去,毕竟是自己选择的路,今天为什么写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://flywaydb.org/documentation/concepts/migrations
也可以去看看这个大佬的博客
https://blog.csdn.net/chenleiking/article/details/80691750
sql相关的语句可以去w3school里看看
https://www.w3school.com.cn/sql/sql_alter.asp
flyway的学习demo