- 项目地址:https://github.com/golang-migrate/migrate
- 参考文章:https://blog.csdn.net/doyzfly/article/details/121096806
1 Install migrate CLI
直接 Release Downloads 下载对应版本。也可以安装官网说明下载。
- Windows:下载压缩包,解压后,将
migrate.exe
放入$GOPATH/bin
目录下
2 postgres测试
测试环境
- windows 10
- windows 10 下的 postgres:14.2
- 虚拟机:vagrant + virbox + centos
1 | Linux localhost.localdomain 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux |
- docker:20.10.7
2.1 拉取 postgres 镜像
1 | docker pull postgres:14-alpine |
2.2 启动 docker / windows 上的 postgres 数据库
连接名:postgres
,密码:password
,虚拟机地址:192.168.33.10
启动镜像
1 | docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres:14-alpine |
进入 postgres 容器
1 | docker exec -it postgres psql -U postgres |
创建数据库 example
1 | create database example; |
\list
查看所有数据库
- windows 略
2.3 创建某次数据库变更的 sql 文件
1 | mkdir migrations #首次执行,用于存放变更的 sql 文件 |
比如说这次修改我们需要新增一个 users 的表,
1 | migrate create -ext sql -dir ./migrations -seq create_users_table |
这个命令会在 migrations
目录下生成两个文件
000001_create_users_table.up.sql
和000001_create_users_table.down.sql
,000001
是某次修改的版本号.000001_create_users_table.up.sql
用来存放创建users
表的sql
脚本,000001_create_users_table.down.sql
用来存放回滚这次操作的sql
脚本。migrate create
命令只负责创建文件,sql
文件的内容需要我们手动编辑。
编辑 000001_create_users_table.up.sql
1 | CREATE TABLE IF NOT EXISTS users( |
编辑 000001_create_users_table.down.sql
1 | DROP TABLE IF EXISTS users; |
2.4 up 与 down
- migrate 的 up 子命令用来应用某一次数据库变更, down 子命令用来回滚数据库变更操作。
1 | up [N] Apply all or N up migrations |
首次执行 migrate up 命令后,会在数据库中添加 schema_migrations 表。这个表有两个字段 version 和 dirty。
version 用来表示当前数据库对应 ./migrations 下面的那个版本,比如第一次执行 migrate up 1 后,如果执行成功了, schema_migrations 表中的 version=1,说明当前数据库对应的是 000001_create_users_table.up.sql 这个版本
dirty=false,执行到 version=1 这次的变更没有出错。如果 dirty=true ,变更出错,需手动处理。
up 和 down 后面的 [N] 是数量。
migrate create -ext sql
命令创建 sql 文件,并给其标号。up 的执行顺序是从小到大,down 是从大到小。up 和 down 执行文件的起始标号根据schema_migrations 里面的 version 确定。若schema_migrations 为空表或不存在,则可认为 version 为 0 。up 的起始标号为 version + 1。 down 为 versioneg:3 个 up.sql 和 3 个 down.sql。空数据库
不加参数 N
- 执行 up 命令,后面不加参数,升序执行所有的 up.sql 文件。顺序 1,2,3
- 执行 down 命令,后面不加参数,降序执行当前 version 的 down.sql,直到1xxx_down.sql执行完。顺序 3,2,1
加参数 N
- 执行 up 2 命令,执行两个 up.sql 文件。顺序 1,2
- 执行 down 1 命令,执行一个 down.sql文件。顺序 2
每次 up 和 down 操作都可能会影响 schema_migrations 表。若 dirty 为 true。则代表操作失败,需手动修改
变更 up:
docker
1 | migrate -database postgres://postgres:password@192.168.33.10:5432/example?sslmode=disable -path ./migrations up 1 |
本地测试
1 | migrate -database postgres://postgres:password@localhost:5432/example?sslmode=disable -path ./migrations up 1 |
返回结果
1 | 1/u create_users_table (23.7245ms) |
数据库
1 | example=# \d |
回滚 down:
1 | migrate -database postgres://postgres:password@localhost:5432/example?sslmode=disable -path ./migrations down 1 |
migrations down 后,数据库恢复到应用 create_users 之前的状态,users 表被删除,schema_migrations 表记录被删除
2.5 应用多次修改
1、第二次修改使用事务为 users 表添加 COLUMN
migrate create -ext sql -dir ./migrations -seq add_mood_to_users
, migrations 目录下会增加 000002_add_mood_to_users.up.sql
和 000002_add_mood_to_users.down.sql
两个文件。
000002_add_mood_to_users.up.sql
1 | BEGIN; |
000002_add_mood_to_users.down.sql
1 | BEGIN; |
2、第三次修改为 users 表增加 role_id 这个 COLUMN
migrate create -ext sql -dir ./migrations -seq add_roleid_to_users
, migrations 目录下会增加 000003_add_roleid_to_users.up.sql
和 000003_add_roleid_to_users.down.sql
两个文件。
000003_add_roleid_to_users.up.sql
1 | ALTER TABLE users ADD COLUMN IF NOT EXISTS role_id INTEGER; |
000003_add_roleid_to_users.down.sql
1 | ALTER TABLE users DROP COLUMN IF EXISTS role_id; |
3、
- migrate up 执行 migrations 目录下所有的 up.sql 脚本。顺序:从 1->3 依次执行
1 | migrate -database postgres://postgres:password@localhost:5432/example?sslmode=disable -path ./migrations up |
返回结果
1 | 1/u create_users_table (24.4893ms) |
- migrate down 执行 migrations 目录下所有的 up.sql 脚本。顺序:从 3->1 依次执行
1 | migrate -database postgres://postgres:password@localhost:5432/example?sslmode=disable -path ./migrations down |
返回结果
1 | Applying all down migrations |
- migrate up 2。执行 1-2
1 | migrate -database postgres://postgres:password@localhost:5432/example?sslmode=disable -path ./migrations up 2 |
返回结果
1 | 1/u create_users_table (17.9567ms) |