Golangでのマイグレーションの使用 - DEV コミュニティ
マイグレーションとは何か?
マイグレーションは、データベースの構造のバージョン管理を維持するためによく使われ、データベースを整理された状態に保つのに非常に役立つソリューションです。
例えば、ユーザーテーブルがあって新しいフィールドを追加したい場合、マイグレーションがなければ、手動で SQL を実行する必要があります。例えば:
ALTER TABLE "users" ADD COLUMN "phone" VARCHAR(255) NULL;
フルスクリーンモードで表示する
しかし、これからは users
テーブルを再作成する必要があるたびにこのフィールドを作成する必要があります。元の users
テーブルの作成を変更しない限りですが、テーブルとアプリケーションが成長するにつれて管理が難しくなるため、マイグレーションを使用することが良い選択です。
マイグレーション
マイグレーションの動作は比較的シンプルで、通常は up
ファイルと down
ファイルがあります。PrismaORMのような一部の ORM は1つのファイルのみを作成しますが、up
ファイルではデータベースの作成や変更を行う SQL を作成し、down
ファイルではその変更を元に戻す SQL を作成します。
どんな利点があるのか?
これらのファイルにより、データベースの変更履歴を保持することができます。各変更はそれぞれの up
ファイルと down
ファイルを持っています。テーブルを作成する必要がある場合は、すべての up
ファイルを実行すればすべてが作成され、元に戻す必要があれば down
を実行すればよいのです。
Go におけるマイグレーション
Go はネイティブではマイグレーションのサポートを提供していませんが、この機能を持った ORM、例えばコミュニティで最も使用されている GORM を利用することができます。しかし ORM を使用せずにマイグレーションを利用することもできるため、golang-migrate パッケージを使用してみましょう。
Golang Migrate パッケージ
golang-migrate パッケージはマイグレーションを管理するために必要なすべてを提供しており、ほとんどすべてのデータベースをサポートしています。私たちの例では PostgreSQL を使用します。
サンプルプロジェクト
私はすでに単純なプロジェクトを作成していますが、重点はマイグレーションの使用方法だけであるので、簡単に説明します。
とてもシンプルな構造になります。サンプルコードはすべて main.go
に置かれます:
package main
import (
"database/sql"
"fmt"
"log"
"os"
"github.com/joho/godotenv"
_ "github.com/lib/pq"
)
func main() {
// .env ファイルを読み込む
godotenv.Load()
postgresURI := os.Getenv("DATABASE_URL")
db, err := sql.Open("postgres", postgresURI)
if err != nil {
log.Panic(err)
}
err = db.Ping()
if err != nil {
db.Close()
log.Panic(err)
}
fmt.Println("データベースに接続されました")
// プログラムを実行し続けます
select {}
}
フルスクリーンモードで表示する
golang-migrate の使用
golang-migrate の CLI をインストールする必要があります、インストール方法はこちらを参照してください。以下のコマンドを実行します:
migrate -version
フルスクリーンモードで表示する
出力が以下のようであれば:
v4.16.2
フルスクリーンモードで表示する
これで続ける準備は整いました!次のステップは、以下のコマンドで最初のマイグレーションを作成することです:
migrate create -ext=sql -dir=internal/database/migrations -seq init
フルスクリーンモードで表示する
ext
: 拡張子を決めます、sql を使用します。dir
: ここにマイグレーションが作成されるディレクトリがあります。seq
: マイグレーションファイルの名前のシーケンスを決めます、数値を使用しますが、タイムスタンプを使用することもできます。
これで database フォルダの中に migrations というフォルダが作成されたことがわかります。
up
と down
のファイルが作成され、最初なので 000001 と番号が振られています。もう一度 migrate create
コマンドを実行すると 000002 のマイグレーションが作成されます。さあ、SQL を作成してマイグレーションを実行しましょう:
up
ファイルで次のようなテーブルを作成します:
CREATE TABLE users (
id VARCHAR(36) NOT NULL PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP(3) NOT NULL
);
フルスクリーンモードで表示する
そして、down
ファイルでテーブルを削除します:
DROP TABLE IF EXISTS users;
フルスクリーンモードで表示する
SQL が準備できたら、マイグレーションの up
を実行します。まず、データベースが実行されていることを確認してください。そのために、プロジェクトに PostgreSQL のイメージを実行するための docker compose ファイルがあります:
migrate -path=internal/database/migrations -database "postgresql://golang_migrate:golang_migrate@localhost:5432/golang_migrate?sslmode=disable" -verbose up
フルスクリーンモードで表示する
path
: ここにマイグレーションが格納されています。database
: データベース接続の URL。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/wiliamvj/usando-migrations-com-golang-4i4e