PythonのWEBフレームワークDjangoを利用したアプリケーションの公式テュートリアルに沿ったWEBアプリケーション作成のメモ第3回です。

前回は投票アプリの手初めてとして「Hello, world.」を表示させました。
今回はデータベースの作成をしていきます。
データベースの設定
「mysite/settings.py」内に「mysite」モジュールの設定が書かれています。
その中のデータベースの設定は次のようになっています。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
デフォルトでSQLite3を使用する設定になっています。
Pythonで公式にサポートしているデータベースエンジンは
- PostgreSQL
- MySQL
- MariaDB
- Oracle
- SQLite3
です。
SQLite3以外のデータベースエンジンを使う場合は、ドライバー等の追加インストールが必要です。
その後に、この設定を書き換える必要があります。
今回はデフォルトのSQLite3を使っていきます。
ついでに同ファイル内の「TIME_ZONE」を「Asia/Tokyo」に変更します。
TIME_ZONE = 'Asia/Tokyo'
マイグレーション
次のコマンドでマイグレーションを実行します。
python manage.py migrate

デフォルトのテーブルが作成されます。

モデル作成
投票アプリ用に「Question」と「Choice」の2つのモデルを作成します。
▼「Question」モデル
対応テーブル名:「polls_question」
| カラム名 | 型 | NOT NULL | デフォルト | オプション |
|---|---|---|---|---|
| id | integer | 〇 | – | 主キー、自動連番 |
| question_text | varchar | 〇 | – | 最長200文字 |
| pub_date | datetime | 〇 | – |
▼「Choice」モデル
対応テーブル名:「polls_choice」
| カラム名 | 型 | NOT NULL | デフォルト | オプション |
|---|---|---|---|---|
| id | integer | 〇 | – | 主キー、自動連番 |
| question_id | bigint | 〇 | – | 外部キー:polls_question.id on_delete: Cascade |
| choice_text | varchar | 〇 | – | 最長200文字 |
| votes | integer | 〇 | 0 | デフォルト: 0 |
「polls/models.py」を編集します。
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
※テーブル名は[アプリケーション名]_[モデル名](全て小文字)
※各テーブルの主キー「id」カラムは自動生成されます。
※外部キーに指定したカラム名は、末尾に「_id」が自動付加されます。
投票アプリの設定追記
投票アプリをプロジェクトに含めるには、「INSTALLED_APPS」の設定に投票アプリの設定クラスを追記する必要があります。
「PollsConfig」クラスは「polls/apps.py」ファイル内にあるので、ドット記法でのクラスのパスは「polls.apps.PollsConfig」になります。
「mysite/settings.py」に「polls.apps.PollsConfig」を追記します。
INSTALLED_APPS = [
"polls.apps.PollsConfig",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
マイグレーション
次のコマンドを実行します。
python manage.py makemigrations polls

「polls/migrations/0001_initial.py」が作成されます。
# Generated by Django 5.0.6 on 2024-07-15 12:29
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Question',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question_text', models.CharField(max_length=200)),
('pub_date', models.DateTimeField(verbose_name='date published')),
],
),
migrations.CreateModel(
name='Choice',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('choice_text', models.CharField(max_length=200)),
('votes', models.IntegerField(default=0)),
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),
],
),
]
マイグレーション実行前に、実行されるSQLを確認してみます。
※この作業はスキップして問題ありません。
python manage.py sqlmigrate polls 0001

▼このようなSQLが出力されます。
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" bigint NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
次の点に注意してください。
🟢正確な出力は、使用しているデータベースによって異なります。上記の例は PostgreSQL 用に生成されています。
🟢テーブル名は、アプリの名前 (投票) とモデルの小文字の名前 (質問と選択肢) を組み合わせて自動的に生成されます。 (この動作はオーバーライドできます。)
🟢主キー (ID) は自動的に追加されます。 (これをオーバーライドすることもできます。)
🟢慣例により、Django は外部キー フィールド名に「_id」を追加します。 (はい、これをオーバーライドすることもできます。)
🟢外部キー関係は、FOREIGN KEY 制約によって明示的に行われます。 DEFERRABLE 部分については心配する必要はありません。これは、トランザクションが終了するまで外部キーを強制しないように PostgreSQL に指示します。
🟢使用しているデータベースに合わせて調整されているため、auto_increment (MySQL)、bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (PostgreSQL)、整数主キーの自動インクリメント (SQLite) などのデータベース固有のフィールド タイプが自動的に処理されます。フィールド名の引用符についても同様です。たとえば、二重引用符や一重引用符を使用します。
🟢sqlmigrate コマンドは実際にデータベース上でmigrationを実行しません。代わりに、SQL Django が必要と判断したものを確認できるように、migrationを画面に出力します。これは、Django が何をしようとしているのかを確認する場合や、変更に SQL スクリプトが必要なデータベース管理者がいる場合に便利です。
テーブルを作成するために、再度マイグレーションを実行します。
python manage.py migrate

テーブル「polls_question」と「polls_choice」が追加されました。

基本的に、migrateコマンドは、「django_migrations」内で定義しれているテーブル操作コマンド内で未実行のものだけを実行します。
モデルに変更を加えたら、
- python manage.py makemigrations
- python manage.py migrate
を実行する流れになります。
今回は以上です。
次回はデータベースの続きを予定しています。
- 0
- 0
- 0
- 0



コメント