.../articles/

GAE/Go + Database migration

GAE/Goで開発する際のデータベースマイグレーションの運用について。

APIを開発する際、データストアとしてMySQLやPostgresSQLなどのRDB(リレーショナルデータベース)を使うことは多いかと思います。

フレームワークによってはRDBのスキーマを編集するのに便利なマイグレーションツールが含まれていることもありますし、私自身アプリケーション開発についてはRuby on Railsから入ったのであまり深く意識せず与えられたものを使ってきました。

しかし、様々な技術スタックで開発をするような状況ではRailsのような感覚のマイグレーションツールは使えないことも少なくはないと思います。

ここではGAE/GoとデータストアとしてPostgreSQLを使う場合のデータベースマイグレーションの運用方法について考えてみました。


データベースマイグレーションの運用にあたって以下の点を考慮し、ツールの選定やセットアップを行いました。

  • マイグレーションに必要となる基本的なオペレーションが簡単であること
  • マイグレーションの記述方法はこだわらない
  • デプロイ時に自動的にスキーマを反映するようにしたい

ということで使うことにしたのが以下のツールです。

sql-migrateの使い方はREADMEにもありますし、日本語でも紹介する記事はあるので詳しくは書きませんが、私は Makefile にマイグレーションのためのタスクを作ってマイグレーションの前後に実行したいコマンドなどをまとめるようにしています(このあたりは別の記事で書こうと思います)。


マイグレーションの手順

ローカル環境でマイグレーション

sql-migrateの使い方はシンプルなので特に解説するほどでもないのですが、基本はローカル環境で以下のような流れで実行していきます。

  • new: 新しいマイグレーションファイルを生成する
  • up: マイグレーションを適用する
  • down: マイグレーションのロールバック

正しくマイグレーションファイルを書いていれば sql-migrate up した時点でスキーマが更新されているはずです。

デプロイ時にマイグレーションを適用する

ローカル環境でマイグレーションを適用した後はどうすればいいでしょうか。
例としてGAE/GoのサーバーからCloud SQLにたてたPostgreSQLを使うケースを考えてみます。

これもREADMEに記述されている内容ではありますが、実例としてコードの一部を抜粋して紹介します。

FileMigrationSource でマイグレーションファイルの場所を指定します、私は app/db/migrations 以下で管理しているので Dir でそのように指定しています。
(データベースに接続するために sqlx を使っています)

package db

import (
	"github.com/jmoiron/sqlx"
	migrate "github.com/rubenv/sql-migrate"
)

var (
	migrations = &migrate.FileMigrationSource{
		Dir: "app/db/migrations",
	}
)

func ExecMigrations(postgresURL string) error {
	pg, err := sqlx.Connect("postgres", postgresURL)
	if err != nil {
		return err
	}
	defer pg.Close()

	appliedCount, err := migrate.Exec(pg.DB, sqlDriver, migrations, migrate.Up)
	if err != nil {
		return err
	}
	log.Printf("Applied %v migrations", appliedCount)
	return nil
}

ExecMigration はマイグレーションを適用するための関数で、これをmainで呼ぶことで起動時にマイグレーションが実行されます。
マイグレーションを実行するかどうかは環境変数などで制御すると良いかと思います。

package main

func main() {
	// 起動時にマイグレーションを適用するかどうかのフラグ
	if applyMigration == True {
		err := db.ExecMigrations(postgresURL)
		if err != nil {
			log.Fatal(err)
		}
	}
	// 略
}

やっていることは少ないですが、これだけでGAEへのデプロイと同時にPostgreSQLのスキーマを更新できるようになりました。
正常にマイグレーションが実行されていれば、ログに「Applied x migrations」と表示されているはずです。

sql-migrateはツールとしてシンプルで使いやすくGolangでしか使えないわけではないので、他の技術スタックで開発する際にも使えそうです。

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

TimesclaeDBのデータ圧縮に関して

TimesclaeDBのデータ圧縮に関して

TimescaleDBはデータベース内の一部のテーブルを時系列データとして扱えるPostgreSQLの拡張です。PostgreSQLの機能拡張なので非常に手軽に導入できます。今回はこのTimesaceDBの圧縮について調べたので備忘録として書き綴りました。

すべての記事

お問い合わせ