Go言語とPostgreSQLで遊ぼう!~マイグレーション編~

こんにちは。KOUKIです。

Go言語とPostgreSQLとDockerを使ったアプリケーション開発を記事にしています。

前回は、開発環境の構築について触れました。

今回は、マイグレーションについて触れます。

そもそも何故マイグレーションが必要なのか

現在、データベースのスキーマーは、コンテナ起動時に自動的に作られるように設定しています。

しかし、アプリケーションの仕様の変更やデータベースの致命的な欠陥が見つかったりなどして、データベースのスキーマー変更が求められることがあります。

現状だと、コンテナを一旦削除して新たに作り直すなどしないとスキーマーをアップデートする術がなく、結構不便です。

これを解決する手段がマイグレーションです。

マイグレーションについて、ハンズオンで学びましょう。

golang-migrate/migrateライブラリの導入

Go製のツールで、golang-migrate/migrateがあります。これをインストールしましょう。

Installation

私の環境はMacなので、brewを使ってインストールします。

スキーマーの作成

golang-migrateを導入できたら、migrateコマンドが使用できるようになります。

次のコマンドで、スキーマーを作成してみましょう。

2種類のファイルが作成されました。

upファイルの方は、「migrate up」で読み込まれるファイルです。downファイルの方は、「migrate down」で読み込まれます。

これらのファイルは、最初は空ファイルになっているので、sqlを書き込む必要があります。

upファイルの方に、前回作成した「Simple bank.sql」ファイルの中身をコピーして貼り付けてください。

dropファイルの方は、table削除コマンドを書いておきましょう。

マイグレーションの実行

いよいよマイグレーションを実行します。

postgresコンテナの確認

最初に、postgresコンテナが起動しているか確認してください。

もし起動していない場合は、「docker-compose up」コマンドで起動しておいてください。

復習ですが、docker-compose.ymlのenvironmentに以下の設定をしているので、コンテナ作成時にpostgresユーザー、simplebankデータベースが作成されています。

一応、コンテナ内に入って、DBを確認してみましょう。

データベースは、存在するようですね。確認ができたので、exit * 2でコンテナから抜けてください。

Makefileの作成

Makefileを作成して、コマンドを追加しておきましょう。

DB作成/削除、コンテナ起動コマンドを追加しました。

削除コマンドの実行

先に削除コマンドを実行してみましょう。

「DETAIL: There is 1 other session using the database.」と出力され、削除できませんでした。ゾンビプロセスが残っているため、削除できないようです。(超めんどくさい)

いくつか解決策があるようですが、この記事の解決策を参考にしてみましょう。

改めて、make dropdbコマンドを実行します。

作成コマンドの実行

次は、DBを作成しましょう。

UP マイグレーション

DBを再作成したので、upファイルの記述情報を元にマイグレーションしてみましょう。

「http://localhost:9232/」にアクセスするとテーブルが作られていることがわかります。

注意事項

注意事項が一つだけあります。ローカルでPostgresが5432ポートで動いている場合、localhost:5432へアクセスするとローカルのPostgresへ繋ぎに行ってしまいます

かくゆう私も、ローカル上でpostgresqlを動作させていたので、マイグレーションを実行したときに以下のエラーに苦しめられました。

認証情報を正しく設定しているにも関わらず、上記のエラーが出ていたのでしばらく悩んでいたのですが、ローカル上でpostgresが動いているのではないかと思い、以下のコマンドを実行しました。

案の定、ローカルでpostgresが動いていましたね…

これをKillするとマイグレーションが可能になります。

DOWN マイグレーション

次は、downファイルを元にマイグレーションを実行してみましょう。

OKですね。

最後に、Makefileを更新しておきましょう。

次回

次は、CRUDを作成しましょう!

Go言語まとめ

オススメ書籍

コメントを残す