Django 1.6まででは作成後のモデルに変更を加える場合、手動でSQLを発行するかsouthのような外部ツールを使用する必要がありました。
ですがDjango 1.7からMigrationsと呼ばれる新機能でモデルへの変更をDBスキーマに反映できるようになりました。
今までsouthも触ったことが無かったのでこの機会にmigrationsを試してみました。
syncdbからmigrateへ
1.7からはsyncdbコマンドがdeprecatedとなりmigrateコマンドに置き換わります。(1.7リリースノート)
なので新しいappを追加した際にもmigrateコマンドで反映できます。
syncdbコマンドも当面は使えるようです。
migrationファイルの作成
モデルに変更を加えた際はまずmakemigrationsコマンドを実行し、migrationファイルを作成します。
python manage.py makemigrations [app名]
[appディレクトリ]/migrations以下にmigrationファイルが作成されるので変更通りか確認します。(複雑な変更は取りこぼすこともあるようです)
デフォルト値の無いフィールドを追加しようとすると、以下のように既存レコードに設定するための一時的なデフォルト値を入力するか中止するか選ばされます。
$ python manage.py makemigrations myapp You are trying to add a non-nullable field 'nickname' to person without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option:
一時的デフォルト値を入力する場合、pythonコードを求められるので””や0などと入力します。
migrate実行
makemigrationsで作ったmigrationファイルをDBスキーマに反映するにはmigrateコマンドを使用します。
python manage.py migrate
migrateコマンドを行った際に未反映のmigrationファイルが存在すると、DBスキーマの変更が行われます。
migrationsとバージョン管理
migrationsディレクトリに作成されるmigrationファイルをコミットすることで、他のマシンでも同じようにmigrationすることができます。
——–
実際触ってみると開発初期とかにコロコロモデル変更してもすぐ反映できるんで楽ですね。
ちなみにapp作成直後はmigrateを先にやってもmakemigrationsを先にやってもどっちでもいいみたいです。
コメント