Hirologue

年齢を理由にエンジニアになることを諦めないミドルの成長記録

EP 27: Herokuものがたり 〜 PostgreSQL編

前回までのあらすじ

Djangoで作成したアプリをHerokuにデプロイするための準備を行い、whitenoiseを使って静的ファイルの処理を行えるようにしました。



目次


データベースの設定

Heroku Postgresの追加

HerokuではPostgreSQLを公式でサポートしていて、使うにはHeroku Postgresというアドオンが必要です。
ただし、このアドオンは無料で利用することができません。
最低でも月額$5〜の利用料金が発生します(2024年10月時点)。
利用にあたってのプランと料金はこちらからご確認ください。

では、ターミナルから次のコマンドを入力して、Heroku Postgresを追加します。

$ heroku addons:create heroku-postgresql:essential-0


アドオンが正常に追加されているか確認するために、次のコマンドを入力します。

$ heroku addons


Heroku Postgresが追加されていることを確認します。


ところで、こちらの記事の中で環境変数DATABASE_URLの設定を後回しにしていました。
こちらの環境変数は、Heroku Postgresを追加した時点で自動的に設定されます。

では、次のコマンドを入力して環境変数の一覧を確認しましょう。

$ heroku config


出力された環境変数の中にDATABASE_URLが確認できたら、次のステップに進みましょう。

Procfileに設定を追記

モデルの変更があった場合は、ローカルでmakemigrationsコマンドを実行することでマイグレーションファイルが作成され、gitによるバージョン管理の対象となっています。

しかし、$ git push heroku mainコマンドを実行してデプロイしてもmigrateコマンドは自動で実行されません。
これでは、ちょっと不便なので解決しましょう。

デプロイ時にmigrateコマンドを自動で実行するためには、Procfileに次の内容を追記する必要があります。

release: ./manage.py migrate --no-input


このコマンドは、Herokuにデプロイした際のreleaseフェーズでmigrateを自動的に実行してくれるものです。
--no-inputオプションは、コマンド実行時にユーザーの入力を求めずに処理を進めるための設定です。

この設定によって、デプロイのコマンドを実行するだけで自動でマイグレーションが行われることになりますので忘れずに設定しましょう。

参考: Heroku スターターガイド (Python) | Heroku Dev Center


psql

psqlは、PostgreSQLをターミナルから操作するためのツールで、データの確認や管理を行う上で必要不可欠なものです。
ローカル環境のみならず、本番環境のPostgreSQLデータベースにも簡単に接続できます。

Dockerコンテナで使う(ローカル環境)

今回のようにDockerを使って開発を行っている場合は、インストールは不要です。次の手順でpsqlを実行します。

次のコマンドを入力してコンテナのリストからPostgreSQLのコンテナ名を調べます。

$ docker ps

出力結果でIMAGES列がpostgresの行にあるNAME列がコンテナ名です。

docker-compose.ymlファイルでPOSTGRES_USERPOSTGRES_DBの値を確認します。

では、確認したところで、次のコマンドを入力してpsqlを実行します。

$ docker exec -it <コンテナ名> psql -U <POSTGRES_USERの値> -d <POSTGRES_DBの値>


以下に入力例を示します。

"""
例
コンテナ名: my_project-db-1
POSTGRES_USER: postgres
POSTGRES_DB: django_develop
"""

$ docker exec -it my_project-db-1 psql -U postgres -d django_develop

コマンドを実行するとローカル環境のPostgreSQLデータベースに接続されます。

しかしながら今回は、Dockerを使った開発環境にHeroku CLIを組み込んでいないため、このままでは本番環境のPostgreSQLデータベースに接続することができません。

本番環境のPostgreSQLデータベースに接続するためには、ローカルマシンでpsqlが実行できるようにする必要があります。

ローカルマシン上で使う(本番環境)

ローカルマシンでPostgreSQLのクライアントツールであるpsqlを実行するためには、libpqをインストールする必要があります。

Homebrewを使ったインストールは以下の手順で行います。

# Homebrewを最新にする
$ brew update

# libpqのインストール
$ brew install libpq

# シンボリックリンクの作成
$ brew link --force libpq

注意:シンボリックリンクを作成しないとパスが通らず、正常に動作しないのでご注意ください。

では、本番環境(Heroku)のPostgreSQLデータベースに接続します。

$ heroku pg:psql


PostgreSQLを操作するコマンドは、こちらの記事が参考になります。 qiita.com

本番環境の動作確認

設定が完了したので、本番環境にデプロイしましょう!
ただし、この状態ではローカル環境で作成したデータは反映されていないので、本番用のデータを作成します。

そのためには、次のコマンドを入力してスーパーユーザーを作成します。

$ heroku python manage.py createsuperuser


このあとの操作はチュートリアルと同じ操作になりますので割愛しますが、本番用のデータを登録して表示されるか確認して終了となります。



おつかれさまでした!

データは無事に本番環境へ反映されたでしょうか?

今回を含めて4回にわたってHerokuの設定について取り上げてきましたが、次回いよいよ最終回となります。

最終回は画像アップロードについて解説しますので、お楽しみに

では、また次の記事で!✋️