DjangoのデータベースをPostgreSQLに変更する方法

Django
記事内に広告が含まれています。

Djangoインストール時のデフォルトのデータベースは、SQLite3が採用されています。手元の開発環境で手軽にアプリの動作確認をする用途では問題ないですが、SQLite3は手軽が故の様々なデメリットもあります。SQLite3が抱えるいくかの問題を以下に挙げます。

  • ローカル上のデータベースファイルにアクセスするため認証を介さずアクセスできてしまう。
  • データベースの容量に限界がある
  • シングルプロセスでデータベースにアクセスするため、テーブルロックがかかってしまい、同時アクセスなどに対応できない。

これらのデメリットはほんの一部ですが、開発プロジェクトが始まる当初からRDBMSを変更しておくことをお勧めします。本番リリース前に変更するのは、リスクが大きいからです。また開発プロジェクトの開始当初から変更したRDBMSに慣れておくことで、そのRDBMS固有の使い方に慣れるというメリットもあります。今回はそのRDBMSとしてPostgreSQLを使い、Djangoアプリから連携できるようにします。

この記事の対象読者

  • Djangoの接続先データベースの変更方法がわからない方
  • Djangoの接続先データベースの変更はわかるけど、Dockerでやるとわからない方

この記事を読んで得られるメリット

  • Djangoの接続先データベースを変更できる
  • DjangoのデフォルトのデータベースはSQLite3なので本番向きではない。開発時点でPostgreSQLなどのデータベースに変更しておき、固有のRDBMSに慣れることができる。

事前手順

DockerとGunicornでDjangoアプリを動かす方法

構成

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-1drf-on-docker-db-1が起動していないことを確認します。

NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS

コマンド

drf-on-docker-app-1drf-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-1drf-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-1drf-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/にアクセスし、以下のような画面が表示されることを確認します。

付録

Files · v0.2.0 · Tadashi Inagaki / drf-on-docker · GitLab
GitLab.com

まとめ

いかがでしたでしょうか。ここまでで以下コンポーネントを使った開発環境を作ることができました。付録で紹介したものを使えば、すぐに環境を構築することができます。

  • Django
  • Django REST framwork
  • PostgreSQL
  • Docker Compose

参考

データベース | Django ドキュメント
The web framework for perfectionists with deadlines.

コメント

タイトルとURLをコピーしました