数据库也能版本控制?
代码可以用Git管理版本,数据库的结构变更能不能也管理起来?
答案是可以的。
为什么需要数据库版本控制
问题场景
- 开发环境加了一个字段,测试环境忘了加,上线出问题
- 不知道某个字段是什么时候加的、谁加的
- 多人开发,数据库结构冲突
数据库版本控制能解决
- 记录每次数据库结构变更
- 自动同步到各个环境
- 可以回滚
常用的工具
Flyway
Java项目中最流行的数据库版本控制工具。
用SQL文件管理变更:
V1__create_user_table.sql
V2__add_email_column.sql
V3__create_order_table.sql
Flyway会自动执行没执行过的脚本。
Liquibase
另一个流行的选择,功能更丰富。
支持XML、YAML、JSON、SQL多种格式定义变更。
Flyway怎么用
1. 添加依赖
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
2. 创建SQL文件
在resources/db/migration目录下创建SQL文件:
-- V1__create_user_table.sql
CREATE TABLE user (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
3. 启动应用
Spring Boot会自动执行这些脚本。
命名规范
Flyway的SQL文件命名有规范:
V1__description.sql -- 版本迁移脚本
V1.1__description.sql -- 版本迁移脚本
R__description.sql -- 可重复执行的脚本
- V开头是版本号,必须递增
- 两个下划线分隔版本号和描述
- 描述用下划线分隔单词
好处
1. 可追溯
每次变更都有记录,知道是什么时候、什么人改的。
2. 环境一致
各个环境的数据库结构自动保持一致。
3. 可回滚
出问题可以回滚到之前的版本。
4. 团队协作
数据库变更也放在Git里,和代码一起review。
最后
数据库版本控制是企业开发的标配。
如果你的项目还是手动执行SQL同步数据库结构,是时候引入Flyway这样的工具了。
