Djangoインストール時のデフォルトのデータベースは、SQLite3が採用されています。手元の開発環境で手軽にアプリの動作確認をする用途では問題ないですが、SQLite3は手軽が故の様々なデメリットもあります。SQLite3が抱えるいくかの問題を以下に挙げます。
- ローカル上のデータベースファイルにアクセスするため認証を介さずアクセスできてしまう。
- データベースの容量に限界がある
- シングルプロセスでデータベースにアクセスするため、テーブルロックがかかってしまい、同時アクセスなどに対応できない。
これらのデメリットはほんの一部ですが、開発プロジェクトが始まる当初からRDBMSを変更しておくことをお勧めします。本番リリース前に変更するのは、リスクが大きいからです。また開発プロジェクトの開始当初から変更したRDBMSに慣れておくことで、そのRDBMS固有の使い方に慣れるというメリットもあります。今回はそのRDBMSとしてPostgreSQLを使い、Djangoアプリから連携できるようにします。
この記事の対象読者
- Djangoの接続先データベースの変更方法がわからない方
- Djangoの接続先データベースの変更はわかるけど、Dockerでやるとわからない方
この記事を読んで得られるメリット
- Djangoの接続先データベースを変更できる
- DjangoのデフォルトのデータベースはSQLite3なので本番向きではない。開発時点でPostgreSQLなどのデータベースに変更しておき、固有のRDBMSに慣れることができる。
事前手順
構成
DjangoにデフォルトでバンドルされいているSQLite3から、データベースをPostgreSQLに変更します。この時SQLite3はただのファイルでしたが、PostgreSQLの場合はサービスとして起動する必要があるためコンテナにする必要があります。PostgreSQLをDjangoと同じようにコンテナ化し、SQLite3のときと同じように開発できるようにします。
手順
PostgreSQL起動
コマンド
プロジェクトのディレクトリに移動します。
cd ~/repos/drf-on-docker
ファイル編集
.envファイルを開き、PostgreSQL関連の環境変数を設定し保存します。以下POSTGRES_PASSWORDはpostgresユーザーのパスワード、PGDATAはPostgreSQLのデータベースクラスタのパスを設定します。データベースクラスタについては本家のサイトを参照ください。
POSTGRES_PASSWORD=mypassword
PGDATA=/var/lib/postgresql/data/pgdata
ファイル編集
docker-compose.ymlを開き、以下内容を追記します。
db:
image: postgres:16.2
environment:
- POSTGRES_PASSWORD=mypassword
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- 5432:5432
volumes:
pgdata:
コマンド
docker comopseの状態を確認します。
docker compose ps
出力結果
drf-on-docker-app-1とdrf-on-docker-db-1が起動していないことを確認します。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
コマンド
drf-on-docker-app-1とdrf-on-docker-db-1を起動します。
docker compose up -d
出力結果
[+] Running 3/3
✔ Network drf-on-docker_default Created 0.0s
✔ Container drf-on-docker-db-1 Started 0.0s
✔ Container drf-on-docker-app-1 Started
コマンド
docker comopseの状態を確認します。
docker compose ps
出力結果
drf-on-docker-app-1とdrf-on-docker-db-1が起動したことを確認します。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
drf-on-docker-app-1 drf-on-docker-app "pipenv run python m…" app 30 seconds ago Up 29 seconds 0.0.0.0:8000->8000/tcp
drf-on-docker-db-1 postgres:16.2 "docker-entrypoint.s…" db 30 seconds ago Up 29 seconds 0.0.0.0:5432->5432/tcp
アプリケーションサーバへのpsycopgインストール
コマンド
drf-on-docker-app-1にログインします。
docker compose exec app bash
コマンド
psycopgをインストールします。この時docker composeでホスト上の~/repos/drf-on-dockerのディレクトリがコンテナ内の/appディレクトリにマウントされているので、ホスト上のPipfileやPipfile.lockにもきちんと同期され、構成管理ができる訳です。
pipenv install psycopg
出力結果
Installing psycopg...
Resolving psycopg...
Added psycopg to Pipfile's [packages] ...
✔ Installation Succeeded
Pipfile.lock (adadca) out of date, updating to (ebf901)...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Locking [dev-packages] dependencies...
Updated Pipfile.lock (bb369fa4208fb68439cc12103ce201890ed5c0a780ce157dc2f5a22a2eebf901)!
Installing dependencies from Pipfile.lock (ebf901)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
PostgreSQLへのログイン
コマンド
PostgreSQLにデーベースマイグレーションをする必要があるため、事前にPostgreSQLにログインします。
docker compose exec db psql -U postgres
出力結果
psql (16.2 (Debian 16.2-1.pgdg120+2))
Type "help" for help.
postgres=#
ロールの作成
コマンド
アプリケーション用のユーザーを作成します。ユーザー名、パスワードはお好みで変更してください。今回はappusr、apppassword1234としています。
CREATE ROLE appusr CREATEDB LOGIN PASSWORD 'apppassword1234';
出力結果
CREATE ROLE
データベースの作成
コマンド
アプリケーション用のデータベースを作成し、先ほど作成したユーザーを所有者とします。データベース名はお好みで変更してください。今回はappdbとしています。
CREATE DATABASE appdb WITH OWNER appusr;
出力結果
CREATE DATABASE
データベース接続設定
ファイル編集
アプリケーション側のデータベースの接続設定を変更します。ユーザー名、パスワード、データベース名を先ほど作ったものと合わせる形で書くことに注意してください。
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "appdb",
"USER": "appusr",
"PASSWORD": "apppassword1234",
"HOST": "db",
"PORT": "5432",
}
}
コマンド
docker comopseの状態を確認します。
docker compose ps
コマンド
drf-on-docker-app-1を再起動します。
docker compose restart app
コマンド
docker comopseの状態を確認します。
docker compose ps
出力結果
drf-on-docker-app-1とdrf-on-docker-db-1が起動したことを確認します。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
drf-on-docker-app-1 drf-on-docker-app "pipenv run python m…" app 32 minutes ago Up 3 minutes 0.0.0.0:8000->8000/tcp
drf-on-docker-db-1 postgres:16.2 "docker-entrypoint.s…" db 32 minutes ago Up 32 minutes 0.0.0.0:5432->5432/tcp
データベースマイグレーション
コマンド
データベースを切り替えたので再度データベースマイグレーションを行う必要があります。
docker compose exec app pipenv run python manage.py migrate
出力結果
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
スーパーユーザの作成
コマンド
こちらも同様にスーパーユーザを再度作成する必要があります。
docker compose exec app pipenv run python manage.py createsuperuser --username admin --email [email protected]
対話入力
Password:
Password (again):
Superuser created successfully.
アクセス確認
http://localhost:8000/users/にアクセスし、以下のような画面が表示されることを確認します。
付録
まとめ
いかがでしたでしょうか。ここまでで以下コンポーネントを使った開発環境を作ることができました。付録で紹介したものを使えば、すぐに環境を構築することができます。
- Django
- Django REST framwork
- PostgreSQL
- Docker Compose
コメント