今回のテーマは「データベースのマイグレーション」です。Djangoにはデータベースマイグレーション機能があります。これを使うことで作成したモデルを元に自動的にデータベースへテーブルを作成してくれます。Ruby on Railsに馴染みのある方にはお馴染みの機能だと思います。余談ですがCakePHPにはマイグレーションとは逆方向のデータベースからモデルを生成するbake model機能があり、とても面白いと思います。 ※本ページはモデルの作成まで読まれた方を対象としています。そのためサンプルソースコードが省略されている場合があります。
初回のマイグレーション
まず、Django標準のモデルのマイグレーションを行いましょう。
(venv)$ ./manage.py migrate
これで初回のマイグレーションが終わりました。現段階では自作のモデルはマイグレーションされません。自作モデルをマイグレーションするにはmakemigrationsを実行する必要があります。
(venv)$ ./manage.py makemigrations
Migrations for 'thread':
thread/migrations/0001_initial.py
- Create model Category
- Create model Comment
- Create model Topic
上記のような出力が得られマイグレーションの準備が出来ました。確認してみましょう。
(venv)$ ./manage.py showmigrations
thread
[ ] 0001_initial
このような出力が得られます。[]内がからということは未だマイグレーションされていないということです。マイグレーション前にどのようなSQLが実行されるのか確認する癖はつけておいた方が良いと思います。
(venv)$ ./manage.py sqlmigrate thread 0001
これでthreadアプリケーションの0001番のマイグレーション時のSQLを閲覧できます。意図せぬSQLが発行されないか確認しておきましょう。ではマイグレーションしてみましょう。
(venv)$ ./manage.py migrate
以下の様に出力されればOKです。
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, thread
Running migrations:
Applying thread.0001_initial... OK
MariaDB/MySQLの場合、以下のようなWARNINGが出るかも知れません。
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.1/ref/databases/#mysql-sql-mode
この場合mysite/settings.pyのDATABASEを修正します。参考:Django-MySQL
mysite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'forum_data',
'USER': 'forum_user',
'PASSWORD': 'devpassword009',
'HOST': 'localhost',
+ 'OPTIONS': {
+ 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
+ },
}
}
これでthreadアプリケーションのモデルをマイグレーション出来ました。今後、モデルを変更することがあれば同様の手順でmakemigrationsを行いマイグレーションを行います。makemigrationsを実行する度にthread/migrationsディレクトリにマイグレーションの記録を残していきます。履歴はshowmigrationsで確認できますし、sqlmigrateでSQLも確認できます。
最後に
他のウェブフレームワークを使用したことがある方は特に躓くところはなかったのではないでしょうか?次回は初期データの投入をしていきます。
Sponsored Link
こちらのサイトを参考にDjangoの学習を進めているのですが、
migrateしても
– Add field topic to comment
– Add field user to comment
の表記がありませんが後々大丈夫でしょうか。
model.pyにもそのような表記がなく、対応している箇所など
あれば教えてください。
また、threadのurlsの部分もaccount/の部分はコメントアウトしたらmigrationできたのですが、
そちらで大丈夫でしょうか。
お忙しい中とは思いますが教えていただければ幸いです。