跳至主要内容

在 Golang 專案輕鬆實現資料遷移

使用資料庫時,善用資料遷移(migrate)的觀念,利用 migration 檔案管理資料表的新噌或刪改是良好的開發習慣。尤其是在本地開發完成,準備容器化或布署的階段,都需要參照 migration 檔案重現本地開發對資料庫做過的操作。

在 Golang 專案中,golang-migrate/migrate 就是實現資料遷移的實用工具。透過 golang-migrate/migrate 的 CLI 介面,工程師只要在終端機下達指令,即可在指定路徑產生帶有編號的 migration 檔案,節省許多管理檔案的心思。以下兩個連結指向其 GitHub 頁面及 CLI 的使用說明。

golang-migrate/migrate

migrate CLI

golang-migrate/migrate 使用筆記

以下是使用 golang-migrate/migrate 時或許會用到的指令。

安裝 golang-migrate 的 migrate CLI

 $ brew install golang-migrate // macOS 可透過 Homebrew 安裝
$ migrate -version // 安裝後檢視版本號
$ migrate --help // 檢視使用說明

建立 migration

 $ migrate create -ext sql -dir db/migration -seq init_schema

上述指令的意思可從 $ migrate --help 得知(終端機提示如下)

create [-ext E] [-dir D] [-seq] [-digits N] [-format] [-tz] NAME
Create a set of timestamped up/down migrations titled NAME, in directory D with extension E.
Use -seq option to generate sequential up/down migrations with N digits.
Use -format option to specify a Go time format string. Note: migrations with the same time cause "duplicate migration version" error.
Use -tz option to specify the timezone that will be used when generating non-sequential migrations (defaults: UTC).

編寫 migration

在全新的專案中透過上述指令可產生兩個 .sql 檔案:

000001_init_schema.up.sql
000001_init_schema.down.sql

由於 up 表示對資料庫執行新的操作,因此該檔案中應編寫新增資料表或插入欄位等語句。至於 down 則表示還原曾經執行的操作,因此該檔案中應編寫刪除資料表或欄位等語句。在編寫 migration 前,若曾透過 dbdiagram.io 輸出 .sql 檔案,即可將其內容貼入 up.sql 檔案當中。

執行 migrate

以下是在 Makefile 編寫 migrate 指令的範例

Makefile
migrateup:
migrate -path db/migration -database "postgresql://root:password@localhost:5432/db_name?sslmode=disable" -verbose up

migratedown:
migrate -path db/migration -database "postgresql://root:password@localhost:5432/db_name?sslmode=disable" -verbose down