投稿日:2019年11月7日
Djangoは簡単にWebアプリケーションを作成できるフレームワークです。この記事は初心者の方向けのDjangoチュートリアルです。
この記事では前回作成したArticleモデルをもとに、sample_blogプロジェクトのDBにテーブルを作成します。
デフォルトの状態ではsample_blogプロジェクトはblogアプリケーションを認識していません。
Part2で話したように、Djangoではプロジェクトに機能を実装したアプリケーションをインストールするというイメージでWebサイトを作成します。どのアプリケーションをインストールするかはプロジェクトディレクトリのsettings.pyでINSTALLED_APPSという定数にリストで定義します。
INSTALLED_APPSに追加する値はアプリケーションのConfigクラスです。python manage.py startappコマンドでアプリケーションを作成した場合、このクラスは勝手にapps.py内に作成されているはずです。
実際にみてみましょう。
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
このクラスを追加してあげればOKです。
[...]
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です。
[...]
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.pyのINSTALLED_APPSのアプリケーション内のModelの変更が適用されます。
マイグレーションは以下の手順で行われます。
では実際にやってみましょう。
マイグレーションは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で説明します)
確認するコマンドは下の様になっています。
python manage.py sqlmigrate {アプリケーションラベル} {マイグレーション}
アプリケーションラベルはConfigのname変数なので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に反映されないことにも注意してください。
今回は以上です。
返信遅れて申し訳ありません。
記事の中のマイグレーションコマンドは
python manage.py makemigrations
です。
見づらくて申し訳ありません。
Djangoはmanage.pyというファイルを経由してDjangoのコア部分のコマンドを実行します。
上記のコマンドは
python 実行ファイル 引数として実行コマンド
という公文になっています。
The English Pornstars Awards: The Most Sexiest, Worst, And Most Bizarre Things We've Seen sex
Best Pornstars Tips To Relax Your Everyday Lifethe Only Best Pornstars Trick That Every Person Must Learn Best Pornstars
You'll Never Guess This Pornstar Kayleigh's Tricks Pornstar Kayleigh
いつも楽しく拝見させて頂いております。
一点質問させてください。
マイグレーションの部分でターミナルにコマンドを打つとerrorになってしまいます。
$ Migrations for 'blog':
bash: Migrations: command not found
何かアイデアが御座いましたらご教授頂ければ幸甚に御座います。