Django入門: マイグレーション ~ 簡単な一行掲示板アプリを作る その7【Windows10】

84, 2020-10-20

目次

はじめに

このシリーズはDjangoで一行掲示板アプリを作ろうというシリーズです。

前回までにDjangoでlinebbsプロジェクトとbbsアプリを作成し、ルート情報とビューを接続してテンプレートを描画する所までやりました。

今回からDjangoのMVTアーキテクチャの「M(Model)」の部分に触れていこうと思います。

前提としてOSはWindows10, 使用するシェルはコマンドプロンプトです。
仮想環境をアクティベートしていない場合はvenv\Scripts\activateを実行して仮想環境をアクティベートしてください。
またプロジェクト内のmanage.pyのあるフォルダにあらかじめ移動しておいてください。

モデルとは?

Djangoにおけるモデルとは、DBのテーブルを抽象化したものです。

DBではデータのカテゴリーを「テーブル」という単位で管理します。
たとえばユーザー情報をデータとして管理したいのであれば、「my_user」などの名前を付けてDBにテーブルを作成します。
Webフレームワークを使わない場合、DBのテーブルはSQLという言語で作成したり操作するのが普通です。

しかしDjangoではこの「テーブルとSQL」を抽象化して「モデル」という一単位にしています。
そのためモデルを編集すればDBのテーブルに変更を加えられるし、モデルを操作すればDBからデータを取得したり、逆にデータを追加したりすることが可能になっています。

そのためDjangoではDBにテーブルを作りたい場合は、代わりにモデルを作成します。
モデルはmodels.pymodels\フォルダ以下に作成されるクラスです。

モデルとマイグレーション

DBにテーブルを作りたい場合、Djangoではモデルを定義するのが普通だということがわかりました。
しかしmodels.pyなどにモデルのクラスを作成したとして、そのモデルのDBへの適用はどうやるのでしょうか?
クラスを作成しただけではDBに変更は加えられません。

作成したモデルをDBに反映したい場合、Djangoでは「マイグレーション」という作業が必要になります。
マイグレーションと言うのは、作成したモデルや変更したモデルを、DBに適用する操作のことを指します。

このマイグレーションをしないと、せっかく作成したモデルもDBに適用されず、宝の持ち腐れ状態になります。
つまりDjangoでは「モデルとマイグレーション」をセットで扱う必要があります。

モデルを作成したり、モデルに変更を加えたらマイグレーションを行うクセを付けるようにしましょう。

モデルとマイグレーションはマブダチ

マイグレーションの詳細

さらにマイグレーションの具体的な内容ですが、Djangoでは↓のような流れで行います。

  • モデルからマイグレーションファイルを作成する

  • マイグレーションを実行する

「モデルからマイグレーションファイルを作成する」の「マイグレーションファイル」とは何なのか?
マイグレーションファイルとは、DBに変更を加えるスクリプトファイルのことです。
このファイルはDjangoがアプリのモデルの変更を調べて半自動で作成します。
マイグレーションファイルはアプリのフォルダ以下のmigrations\フォルダ以下に作成されます。

Djangoのマイグレーションでは最初にこのマイグレーションファイルを作成します。
そして開発者の操作でこのマイグレーションファイルを適用するのが「マイグレーションを実行する」ということになります。

これらの操作はmanage.pyのサブコマンドから行うことが出来ます。
マイグレーションファイルの作成は

python manage.py makemigrations

と言うコマンドで行います。
マイグレーションの実行は

python manage.py migrate

で行います。

管理モデルなどのマイグレーション

マイグレーションの方法がわかったので、さっそく実行してみましょう。
マイグレーションは本番環境などでは多少神経質に行う必要がありますが、開発時のSqlite3のDBではそこまで神経質に行う必要はありません。気楽にやりましょう。
DjangoではデフォルトのDBにSqlite3というファイル型のDB(db.sqlite3)を使いますが、これは所詮ただのファイルなので、マイグレーションに失敗したらファイルごと消して最初からやり直せばOKです。
むしろ最初は失敗する気でやってみてください。

Djangoでは新規でプロジェクトを作成した段階では、プロジェクトが持っている管理ページなどのモデルのマイグレーションは実行されていません。
この管理ページのモデルなどのマイグレーションは、開発者が自分で行う必要があります。
新規でプロジェクトを作成したら、これらのモデルのマイグレーションを最初に行うようにしましょう。

試しに今の段階で開発用サーバーを起動してみてください。

> python manage.py runserver 0.0.0.0:8123

すると↓のようなメッセージが端末に表示されるはずです。

>python manage.py runserver 0.0.0.0:8123
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 21, 2020 - 04:49:40
Django version 3.1.1, using settings 'linebbs.settings'
Starting development server at http://0.0.0.0:8123/
Quit the server with CTRL-BREAK.

↑の真ん中辺のメッセージを見てください。

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.

と書いてあります。
これは「18個のマイグレーションが未適用です。プロジェクトが正常に動作しない可能性があります。admin, auth, contenttypes, sessions」という意味です。

つまりDjango3.1.1ではプロジェクトを新しく作成した段階で18個のマイグレーションファイルがあるわけです。
前回までのアプリを見てもわかる通り、マイグレーションを実行しなくてもある程度アプリは動作します。
しかしモデルに関わる処理を実行する場合は、このマイグレーションを実行しておかないとエラーになる場合があります。

それからdb.sqlite3をエディタなどで開いてみてください。
今の段階では何も書かれていないのがわかると思います。

それではプロジェクトにマイグレーションを実行しましょう。
このマイグレーションではすでにマイグレーションファイルがあるので、これらの作成は必要ありません。
つまり「makemigrations」は実行する必要はありません。

以下のコマンドを実行します。

> python manage.py migrate

↑のコマンドを実行すると↓のような結果になります。

> 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

18個のマイグレーションファイルが実行され、マイグレーションが完了しました。
contenttypes.0001_initialauth.0001_initialなどがマイグレーションファイルの名前です。
その横に「OK」と書かれていますが、これはマイグレーションが成功したということです。

ではdb.sqlite3をエディタで開いてみてください。
先ほどは空っぽだったdb.sqlite3の中身ですが、マイグレーションの実行後はデータが書き込まれているのがわかると思います。

エディタでdb.sqlite3を壊してしまった場合は、db.sqlite3を削除して再度マイグレーションを実行してみてください。
db.sqlite3が自動で作成されます。

おわりに

今回はモデルとマイグレーションの解説と、実際にマイグレーションを実行する所までやってみました。
次回から実際に掲示板のためのモデルを作成していきたいと思います。

来週へ続く