如何在Golang中编写和运行数据库迁移?
1.如何在Golang中编写和运行数据库迁移?
安装好MySQL或其他数据库,创建一个数据库test
(后面需要用到):
-
安装
migrate
(https://github.com/golang-migrate/migrate/releases) -
在项目根路径下创建
db/migration
文件夹,用来存储所有的迁移文件 -
创建migrations
migrate create -ext sql -dir db/migration -seq init_schema # -ext 文件扩展名为sql # -seq 标志生成的迁移文件的顺序版本号(init_schema任意写,比如:create_accounts)
可以看到
db/migration
下生成了两个文件:000001_init_schema.up.sql 000001_init_schema.down.sql
打开要转移的包含sql语句的文件
*.sql
,将所有sql语句复制到000001_init_schema.up.sql
里面,比如我这里的sql语句就是创建了三个表(为了方便展示删除了多余内容):CREATE TABLE accounts ( name varchar(16) ); CREATE TABLE transfers ( name varchar(16) );
对于
000001_init_schema.down.sql
文件,我们应还原其对应000001_init_schema.up.sql
中sql语句所做的更改,因为up中是创建三个表,所以对应的down就是删除这三个表(如果有外键关联,注意执行顺序):DROP TABLE IF EXISTS accounts; DROP TABLE IF EXISTS transfers;
-
运行migrations
migrate -path db/migration -database "mysql://root:123456@tcp(127.0.0.1:3306)/test" -verbose up # -path 指定迁移文件的文件夹 # -database 指定DSN # -verbose 用来在迁移时打印详细日志记录
2.Makefile
migrateup:
migrate -path db/migration -database "mysql://root:123456@tcp(127.0.0.1:3306)/test" -verbose up
migratedown:
migrate -path db/migration -database "mysql://root:123456@tcp(127.0.0.1:3306)/test" -verbose down
.PHONY: migrateup migratedown
make migrateup
向上迁移,make migratedown
向下迁移。