Django初回起動時、なぜModelがないのにmigrateが必要なの?

こんにちは!

「【個人開発】Djangoとは何か?初心者のための基本とサンプルコードを図解しながら実装する」の記事を読んでいただきありがとうございます。

前回の記事で、簡単な「Hello First App!」を表示するアプリを作成し、途中で以下のコマンドを実行しましたね。

python manage.py migrate  # 初回実行時に必要なデータベース設定

記事内では「初回実行時に必要なデータベース設定」とだけ書きましたが、「あれ?まだデータベースを使うためのModel(モデル)は作っていないのに、なぜデータベースの設定が必要なんだろう?」と疑問に思った方もいらっしゃるかもしれません。

今回は、その疑問にお答えするための補足説明です!

migrateコマンド

まず、migrate(マイグレイト)コマンドが何をするものだったか、簡単に理解しましょう。

役割
アプリケーションの「データベース設計図」(マイグレーションファイル)を見て、実際のデータベースにテーブルなどを作成したり、変更したりするコマンド。

イメージとしては、家の設計図(マイグレーションファイル)をもとに、大工さん(migrateコマンド)が実際に家(データベースのテーブル)を建てる感じ。

以下の図の、【①Model】と【DB】が関連する点です。

なぜModelがないのにmigrateが必要だったの?

さて、前回のfirstappでは、データベースにデータを保存するための設計図であるmodels.pyには何も書きませんでした。

つまり、firstapp自体はデータベースをまだ使っていません。

それなのにmigrateが必要だった理由は、Djangoには最初から便利な機能(組み込みアプリ)がたくさん用意されていて、それらの一部が動作するためにデータベースを必要とするからです。

組み込みアプリって何?

思い出してみてください。

helloproject/settings.pyという設定ファイルを開くと、INSTALLED_APPSというリストがありましたね。

# helloproject/settings.py の一部

INSTALLED_APPS = [
    'django.contrib.admin',      # 管理画面機能
    'django.contrib.auth',       # ログインなどの認証機能
    'django.contrib.contenttypes',
    'django.contrib.sessions',     # ユーザーがログイン状態を保つ機能など
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'firstapp',                  # 私たちが作ったアプリ
]

このリストには、私たちが作ったfirstapp以外にも、admin(管理画面)、auth(認証)、sessions(セッション)といった、Djangoが最初から用意してくれている便利な部品(アプリケーション)が入っています。

これらの組み込みアプリの中には、例えば以下のようにデータベースを使うものがあります。

ここまでの完了要件①
  1. [django.contrib.auth]

    ユーザーアカウント情報(IDやパスワードなど)や権限グループなどを保存するためのテーブルが必要。

  2. [django.contrib.sessions]

    ユーザーがログインしている状態などを記録しておくためのテーブルが必要。

  3. [django.contrib.admin]

    管理画面でどのデータを管理するかなどの情報を保存するためのテーブルが必要。

つまり、前回のpython manage.py migrateは、私たちが作ったfirstappのためではなく、これらのDjango標準装備のアプリたちが使うためのデータベーステーブルを準備するために実行されたのです。

migrateコマンドは、INSTALLED_APPSに書かれているすべてのアプリをチェックして、「まだデータベースに反映されていない設計図(マイグレーション)はないかな?」と探し、見つけたらデータベースに適用してくれます。

まとめ

  • migrateコマンドは、データベースの準備をするためのコマンド。
  • 自分のアプリ(firstapp)にModelがなくても、Djangoに最初から入っている便利なアプリ(admin, authなど)がデータベースを使うため、初回にmigrateが必要だった。
  • migrateはINSTALLED_APPSにある全てのアプリのデータベース設定を行う。

これで、「Modelを作ってないのに、なぜmigrate?」という疑問は解消されたでしょうか?

今後、皆さんがご自身のアプリでデータベースを使いたくなった時(例えばToDoリストのタスクを保存するなど)は、models.pyに設計を書き、python manage.py makemigrationsで設計図を作り、そしてpython manage.py migrateでデータベースに反映させる、という手順を踏むことになります。

今回のmigrateは、そのための最初の一歩、Django自身の準備運動のようなものだった、と考えてみてくださいね。

それでは、また次回の記事でお会いしましょう!