1. CLI 用途的安裝 [文檔]
[確保] CLI 工具使用 go 命令安裝時,不應該在 go.mod 所在的目錄中執行命令,也就是先進入到其它非項目目錄內。
$ go get -tags 'postgre' github.com/golang-migrate/migrate/v4/cmd/migrate
postgre 可以替換為適用你當前數據庫的名稱,共有這些支持的 database,未來構建的約束會被移除 [issue].
$ migrate --help
$ migrate -source file://path/to/migrations -database postgre://localhost:5432/database_name up 2 # 指定文件和數據庫連接
$ migrate -database "$MY_MIGRATE_DATABASE" # 或者 從環境變量指定數據庫連接的方式,其它方式參見文檔
2. 另一種是 非 CLI ,在 go 項目中使用的方式
當前主要版本是 github.com/golang-migrate/migrate/v4
3. 快速開始
創建遷移:migrate create -ext sql -dir db/migrations -seq create_users_table
運行遷移:migrate -database YOUR_DATABASE_URL -path PATH_TO_YOUR_MIGRATIONS up
強制指定版本:migrate -path PATH_TO_YOUR_MIGRATIONS -database YOUR_DATABASE_URL force VERSION (example)
另外不同的數據庫所使用的 DSN 會不一樣, 使用不正確的有時候你會得到 error: default addr for network '127.0.0.1:3306' unknown
4. 實踐
# 查看包創建的表 schema_migrations 里存的 version 值,比如:2(dirty)
migrate -path db/migrations -database "mysql://user:pass@(127.0.0.1:3306)/mydb?multiStatements=true" version
# 如果 migrate 遇到 error,那么 schema_migrations 表里當前 version 對應的 dirty 字段會標記為 1
# 將指定 version 的 dirty 更新為 0,使用如下命令,force 后面跟的是 version 值:
migrate -path db/migrations -database "mysql://user:pass@(127.0.0.1:3306)/mydb?multiStatements=true" force 2
Refer:golang-migrate