※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。

<前のページ
【初心者チュートリアル】Django2でブログ作成(Part3)〜Modelの作成~
次のページ>
【初心者チュートリアル】Django2でブログ作成(Part5)〜管理サイトを使おう~

【初心者チュートリアル】Django2でブログ作成(Part4)〜DBテーブルの作成~

web開発 python3 Django python Djangoチュートリアル SQL データベース

投稿日:2019年11月7日

このエントリーをはてなブックマークに追加
Djangoは簡単にWebアプリケーションを作成できるフレームワークです。この記事は初心者の方向けのDjangoチュートリアルです。

はじめに

この記事では前回作成したArticleモデルをもとに、sample_blogプロジェクトのDBにテーブルを作成します。


アプリケーションのインストール

インストールとは?

デフォルトの状態ではsample_blogプロジェクトはblogアプリケーションを認識していません。

Part2で話したように、Djangoではプロジェクトに機能を実装したアプリケーションをインストールするというイメージでWebサイトを作成します。どのアプリケーションをインストールするかはプロジェクトディレクトリのsettings.pyINSTALLED_APPSという定数にリストで定義します。

プロジェクトにアプリケーションをインストールしてみよう!

INSTALLED_APPSに追加する値はアプリケーションのConfigクラスです。python manage.py startappコマンドでアプリケーションを作成した場合、このクラスは勝手にapps.py内に作成されているはずです。

実際にみてみましょう。

sample_blog/blog/apps.py
from django.apps import AppConfig


class BlogConfig(AppConfig):
    name = 'blog'

このクラスを追加してあげればOKです。

sample_blog/sample_blog/settings.py
[...]

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',           # 追加
]

[...]

INSTALLED_APPSに追加する文字列はアプリケーション名でもOKです。

sample_blog/sample_blog/settings.py
[...]

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',                    # これでもOK
]

[...]

これでsample_blogプロジェクトからblogアプリケーションが認識できるようになりました。


マイグレーションしてテーブル作成

マイグレーションとは

blogアプリケーションのインストールが完了したので、次に必要なのは対応するテーブルです。DjangoではModelの作成・変更は自動的にDBに適用されません。マイグレーションという動作をして初めてsettings.pyINSTALLED_APPSのアプリケーション内のModelの変更が適用されます。

マイグレーションは以下の手順で行われます。

  1. DBへの変更を定義するファイル(マイグレーションファイルという)の作成
  2. マイグレーションファイルをもとにDBに変更を適用(マイグレートという)

では実際にやってみましょう。

実践【マイグレーション】

マイグレーションはmanage.pyを使って以下のコマンドで行えます。

ターミナル
$ python manage.py makemigrations
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Article

これでblogディレクトリのmigrationsディレクトリ内に0001_init.pyというマイグレーションファイルが作成されました。

このファイルはDBにどのような変化をするかが記述されます。

実践【マイグレート】

Djangoではマイグレートをコマンドから行います。マイグレートは裏側でにSQL文が実行されるのですが、マイグレートする際にはそのSQL文は確認できません。

今回はチュートリアルなので、マイグレートする前にどんなSQL文が実行されるのか確認してみましょう。

これにはsqlmigrateコマンドで確認することができます。このコマンドで出力されるSQL文はsettings.pyで設定されているDBの種類によって変化することに注意してください。(settings.pyについては後のPartで説明します)

確認するコマンドは下の様になっています。

実行されるSQL文を確認するコマンド
python manage.py sqlmigrate {アプリケーションラベル} {マイグレーション}

アプリケーションラベルはConfigname変数なのでblogになります。マイグレーション名はマイグレーションファイルのファイル名の拡張子(.py)を抜いた部分です。今回は先程作成された0001_initial.pyを見るので0001_initialですね。

ターミナル
$python manage.py sqlmigrate blog 0001_initial
BEGIN;
--
-- Create model Article
--
CREATE TABLE "blog_article" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(250) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "created" datetime NOT NULL, "updated" datetime NOT NULL, "status" varchar(10) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_article_author_id_905add38" ON "blog_article" ("author_id");
COMMIT;

DBに何らかのアクシデントがあった場合にこのコマンドは非常に便利なので、心のどこかに覚えておきましょう。

では実際にDBに変更を適用させます。以下のコマンドでINSTALLED_APPSに設定されているアプリケーションの、まだ適用されていないマイグレーションファイルの変更がすべてDBに反映されます。

ターミナル
$ $ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

作成されたテーブル

マイグレートが成功すると下の様にテーブルが新しく作成されます。


さいごに

新しくModelを作成したときやModelに変更を加えたときなどには、makemigrationsコマンドでこまめにマイグレーションファイルを作成しましょう。マイグレーションファイルはDBの変更の履歴になるので後々結構助かったりします。

またmigrateコマンドを打つまでは変更はDBに反映されないことにも注意してください。

今回は以上です。

このエントリーをはてなブックマークに追加

<前のページ
【初心者チュートリアル】Django2でブログ作成(Part3)〜Modelの作成~
次のページ>
【初心者チュートリアル】Django2でブログ作成(Part5)〜管理サイトを使おう~

関連記事

記事へのコメント
1:新米
2020年12月3日17:21

いつも楽しく拝見させて頂いております。
一点質問させてください。

マイグレーションの部分でターミナルにコマンドを打つとerrorになってしまいます。
$ Migrations for 'blog':
bash: Migrations: command not found
何かアイデアが御座いましたらご教授頂ければ幸甚に御座います。

2:Marsquai
2021年3月9日0:43

返信遅れて申し訳ありません。
記事の中のマイグレーションコマンドは
python manage.py makemigrations
です。
見づらくて申し訳ありません。
Djangoはmanage.pyというファイルを経由してDjangoのコア部分のコマンドを実行します。
上記のコマンドは
python 実行ファイル 引数として実行コマンド
という公文になっています。