こんにちは。よっしーです(^^)
今日は、slimのローカル開発環境にgolang-migrateを導入する方法についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
先日、MariaDBを導入したので、テーブル作成やデータ登録などのSQLを管理するDBのマイグレーションツールを導入したときの修正内容をご紹介します。
今回導入したマイグレーションツールは下記になります。
修正内容
下記のファイルが修正、新規になります。下記の各セクションにファイルの内容が記載されています。
modified: Makefile
modified: app/.env
modified: app/compose.yml
new file: app/migrate/sql/000001_create_tbl_sample.down.sql
new file: app/migrate/sql/000001_create_tbl_sample.up.sql
new file: app/migrate/sql/000002_insert_tbl_sample.down.sql
new file: app/migrate/sql/000002_insert_tbl_sample.up.sql
Makefile
47行目に追加します。
+# migrate create ex) SQL_NAME=xxx make migrate_create
+.PHONY: migrate_create
+migrate_create:
+ cd $(WOKR_DIR) \
+ && docker compose run -it --rm migrate-cmd create -ext sql -dir /migrations -seq $(SQL_NAME)
+
+# migrate version
+.PHONY: migrate_version
+migrate_version:
+ cd $(WOKR_DIR) \
+ && . .env \
+ && docker compose run -it --rm migrate-cmd -path /migrations -database "$${MIGRATE_DNS}" version
+
+# migrate up
+.PHONY: migrate_up
+migrate_up:
+ cd $(WOKR_DIR) \
+ && . .env \
+ && docker compose run -it --rm migrate-cmd -path /migrations -database "$${MIGRATE_DNS}" up
+
+# migrate down
+.PHONY: migrate_down
+migrate_down:
+ cd $(WOKR_DIR) \
+ && . .env \
+ && docker compose run -it --rm migrate-cmd -path /migrations -database "$${MIGRATE_DNS}" down
+
+# migrate force
+.PHONY: migrate_force
+migrate_force:
+ cd $(WOKR_DIR) \
+ && . .env \
+ && docker compose run -it --rm migrate-cmd -path /migrations -database "$${MIGRATE_DNS}" force 1
app/.env
2行目に追加します。
+MIGRATE_DNS='mysql://app_user:P@ssw0rd@tcp(mariadb:3306)/sample?multiStatements=true'
app/compose.yml
51行目に追加します。
+ migrate-cmd:
+ image: migrate/migrate:v4.16.2
+ container_name: migrate-cmd
+ volumes:
+ - ./migrate/sql:/migrations
+ networks:
+ - net
+ profiles:
+ - tools
app/migrate/sql/000001_create_tbl_sample.up.sql
下記の内容でファイルを作成します。
CREATE TABLE IF NOT EXISTS sample (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=INNODB;
app/migrate/sql/000001_create_tbl_sample.down.sql
下記の内容でファイルを作成します。
DROP TABLE IF EXISTS sample;
app/migrate/sql/000002_insert_tbl_sample.up.sql
下記の内容でファイルを作成します。
INSERT INTO sample(title) VALUES ('test 1');
app/migrate/sql/000002_insert_tbl_sample.down.sql
下記の内容でファイルを作成します。
TRUNCATE TABLE sample;
動作確認
下記のコマンドを実行します。
make up
下記のコマンドを実行します。
make migrate_up
下記のコマンドを実行します。
make loginMariadb
下記のコマンドを実行します。
mariadb -uapp_user -p -Dsample -e "select * from sample;"
下記のような出力になっていれば、成功です。
root@50db19c98989:/# mariadb -uapp_user -p -Dsample -e "select * from sample;"
Enter password:
+----+--------+---------------------+
| id | title | created_at |
+----+--------+---------------------+
| 1 | test 1 | 2023-07-11 02:13:36 |
+----+--------+---------------------+
解説
golang-migrateについて
Go言語でデータベースのマイグレーションを行うためのライブラリである”golang-migrate”について説明します。
“golang-migrate”は、データベーススキーマの変更やバージョンアップなど、データベースのマイグレーションを管理するためのツールです。以下のような特徴を持っています:
- マルチプラットフォーム対応: “golang-migrate”は、主要なデータベースプラットフォーム(PostgreSQL、MySQL、SQLite、Microsoft SQL Serverなど)に対応しています。これにより、異なるデータベース間でのスキーマの変更を簡単に管理することができます。
- マイグレーションのバージョニング: “golang-migrate”では、データベースのスキーマ変更をバージョンごとに管理します。マイグレーションスクリプトは、バージョン番号を持つファイルとして保存され、順序付けられた実行が可能です。
- シンプルなコマンドラインインターフェース: “golang-migrate”は、コマンドラインツールとして提供され、簡単にデータベースのマイグレーションを実行できます。マイグレーションの作成、実行、ロールバックなどのコマンドが提供されています。
- プログラム内からの利用: “golang-migrate”は、プログラム内からも利用することができます。Goのパッケージとして提供されており、ライブラリを使用してカスタムのマイグレーションロジックを実装することができます。
“golang-migrate”のインストール方法や具体的な使用方法については、公式のドキュメントを参照することをおすすめします。ドキュメントには、各データベースプラットフォームへの接続方法やマイグレーションの作成方法など、詳細な情報が記載されています。
app/migrate/sql/*.sql
sqlファイルは下記のコマンドで作成することができます。
SQL_NAME=(拡張子と最初の数値を除いたファイル名) make migrate_create
例えば、下記のコマンドを実行すると、
SQL_NAME=create_tbl_dummy make migrate_create
下記のファイルが作成できます。
/migrations/000003_create_tbl_dummy.up.sql
/migrations/000003_create_tbl_dummy.down.sql
おわりに
今日は、slimのローカル開発環境にgolang-migrateを導入する方法についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント