🐍
【Python】docker&Djangoでデータベースのセットアップを行う
開発環境:
- 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
に準ずる内容となっている。
- アプリケーションのトップページが表示されている状態から解説をしていく。
開発環境の構築がまだの方はこちらから↓
基礎編
1.データベース(PostgreSQL)の準備
導入されているパッケージを確認する
requirements.txtの内容が表示される。
docker-compose exec web pip list
psycopg2
)を追加する
PostgreSQL(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)の設定
settings.py
に適用
PostgreSQLの設定を以下をプロジェクトフォルダ配下の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;
参考
Discussion