🐍

【Python】docker&Djangoでデータベースのセットアップを行う

2024/11/18に公開

開発環境:

  • windows 11
  • Vscode 1.87.2
  • Docker 26.1.1
  • Docker-compose 2.27.0
  • python
  • Django

達成目標

  • DjangoアプリケーションとPostgreSQLを接続し、テーブルを作成することができる。

前提

  • DjangoのマニュアルのWriting your first Django app, part 2に準ずる内容となっている。

https://docs.djangoproject.com/en/5.1/intro/tutorial02/

  • アプリケーションのトップページが表示されている状態から解説をしていく。

開発環境の構築がまだの方はこちらから↓

https://zenn.dev/code_journey_ys/articles/ddd8ba305a2538

基礎編

1.データベース(PostgreSQL)の準備

導入されているパッケージを確認する

requirements.txtの内容が表示される。
docker-compose exec web pip list

PostgreSQL(psycopg2)を追加する

requirements.txtに追記する
Django==5.0.1
djangorestframework==3.14.0
psycopg2-binary==2.9.9 #追加

コンテナを停止し、イメージを再構築する

docker-compose down
docker-compose up --build

導入確認

ターミナルで実行
docker-compose exec web pip list
実行結果
Package             Version
------------------- -----------
Django              5.0.1
django-cors-headers 4.3.1
django-storages     1.14.2
djangorestframework 3.14.0
psycopg2-binary     2.9.9
python-dateutil     2.9.0.post0
python-dotenv       1.0.1

2.データベース(PostgreSQL)の設定

PostgreSQLの設定をsettings.pyに適用

以下をプロジェクトフォルダ配下のsettings.pyフォルダのDatabaseへ
import os
from pathlib import Path
from dotenv import load_dotenv

# .envファイルをロード
load_dotenv()

BASE_DIR = Path(__file__).resolve().parent.parent

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('DB_NAME', 'myproject'),          # データベース名
        'USER': os.getenv('DB_USER', 'myprojectuser'),      # ユーザー名
        'PASSWORD': os.getenv('DB_PASSWORD', 'mypassword'), # パスワード
        'HOST': os.getenv('DB_HOST', 'localhost'),          # ホスト
        'PORT': os.getenv('DB_PORT', '5432'),               # ポート
    }
}

.envファイルの追記

.envファイルをプロジェクトのルートディレクトリに作成し、以下の内容を記述する
DB_NAME=myproject
DB_USER=myprojectuser
DB_PASSWORD=mypassword
DB_HOST=db
DB_PORT=5432

3.データベース(PostgreSQL)に接続する

PostgreSQLコンテナにアクセスする

PostgreSQLコンテナにアクセスする(container_name=db)
docker-compose exec <postgres_container_name> psql -U postgres
接続に成功すると以下のようになる
$ docker-compose exec db psql -U postgres  
time="2024-11-18T22:41:06+09:00" level=warning 
psql (16.5 (Debian 16.5-1.pgdg120+1))
Type "help" for help.

postgres=#

ユーザーを作成する

コンテナに入り、ユーザーを作成する。
CREATE USER myprojectuser WITH PASSWORD 'mypassword';

作成したユーザに権限を付与する

myprojectuserというユーザーにスーパー権限を付与している
ALTER USER myprojectuser WITH SUPERUSER;

ユーザーが作成されているか確認する

/du

4.データベースを作成する

データベースの一覧を確認する

データベースの一覧を確認する
\l

現在接続しているデータベースを確認する

現在接続しているデータベースを確認する
\c
接続しているDBを切り替える
\c <database_name>と入力すると切り替えることが可能
postgres-# \c reha_navi
You are now connected to database "reha_navi" as user "postgres".
reha_navi-#

テーブルの一覧を確認する

テーブルの一覧を確認する
\dt

5.モデルの作成

アプリケーションフォルダ内のmodels.pyフォルダの編集

app/models.py
class User(models.Model):
    username = models.CharField(max_length=150, unique=True)
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    phone_number = models.CharField(max_length=15, blank=True, null=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.username

6.マイグレーションの実行

マイグレーションコマンドの実行

以下のコマンドを実行することで、必要なデータベーステーブルを作成することができる。

通常
py manage.py makemigrations polls
py manage.py migrate
dockerの場合
doker-compose exec <containar_name> python manage.py makemigrations <application_name>
docker-compose exec <containar_name> python manage.py migrate
出力結果
makemigrationsを実行時
docker-compose exec web python manage.py makemigrations
time="2024-11-18T23:26:48+09:00" level=warning 
Migrations for 'users':
  users/migrations/0001_initial.py
    - Create model User
migrate実行時
 docker-compose exec web python manage.py migrate
time="2024-11-18T23:33:45+09:00" level=warning 
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, users
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
  Applying users.0001_initial... OK
マイグレーションの手段
全てを適用する場合
docker-compose exec <container_name> python manage.py migrate
特定のアプリケーションのみを適用する場合
docker-compose exec <container_name> python manage.py migrate users

テーブルの確認

PostgreSQLコンテナにアクセスする(container_name=db)
docker-compose exec <postgres_container_name> psql -U postgres
現在接続しているデータベースを確認する
\c <database_name>
テーブル一覧確認(PostgreSQL)
\dt
その他DB(MariaDB、MySQLなど)のテーブル確認コマンド
MariaDB、MySQL
SHOW TABLES;
SQLite
.tables
Oracle
SELECT TABLE_NAME FROM USER_TABLES;
実行結果
テーブル一覧確認
# \dt
                      List of relations
 Schema |            Name            | Type  |     Owner
--------+----------------------------+-------+---------------
 public | auth_group                 | table | myprojectuser
 public | auth_group_permissions     | table | myprojectuser
 public | auth_permission            | table | myprojectuser
 public | auth_user                  | table | myprojectuser
 public | auth_user_groups           | table | myprojectuser
 public | auth_user_user_permissions | table | myprojectuser
 public | django_admin_log           | table | myprojectuser
 public | django_content_type        | table | myprojectuser
 public | django_migrations          | table | myprojectuser
 public | django_session             | table | myprojectuser
 public | users_user                 | table | myprojectuser
(11 rows)
マイグレーションの実行状況を確認
マイグレーションの実行状況を確認
docker-compose exec web python manage.py showmigrations
出力結果
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial
users
 (no migrations)
settings.pyについて

・デフォルトでは、INSTALLED_APPS次のアプリが含まれており、すべて Django に付属しています。

  • django.contrib.admin– 管理サイト。
  • django.contrib.auth– 認証システム。
  • django.contrib.contenttypes– コンテンツタイプのフレームワーク。
  • django.contrib.sessions– セッション フレームワーク。
  • django.contrib.messages– メッセージング フレームワーク。
  • django.contrib.staticfiles– 静的ファイルを管理するためのフレームワーク。
すべて権限を付与するコマンド
ALTER ROLE myprojectuser
    WITH SUPERUSER
    CREATEDB
    CREATEROLE
    REPLICATION
    BYPASSRLS;

参考

https://docs.djangoproject.com/en/5.1/intro/tutorial02/

Discussion