(ローカル環境で開発中。SQLite3での話です。)
Djangoでアプリを作成中に一度マイグレーションをした後、テーブル定義を変更したくなりました。
そのため、models.pyを書き換え(add column)再びmakemigrationsを行ったところ幾多の問題にぶち当たりました。
その(かなり強引な)解決法のなぐり書き備忘です。
その1
テーブルにデータが入ったままマイグレーション
./manage.py makemigrations ./manage.py maigrate
上記のコマンドを打っていると、「追加したカラムに初期値を設定してください。」的なメッセージが出ます。
You are trying to add a non-nullable field '~追加したカラム~' to user 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 with a null value for this column) 2) Quit, and let me add a default in models.py Select an option:
1)を選択すると、初期値を設定する
2)を選択するとマイグレーションを一旦やめて、models.pyに初期値を設定する
みたいな感じだと思います。
そこで、1を選択して初期値を続けて入力します。
今回、初期値を入力した際に数値項目に文字列を入れてしまったようでおかしな事になりました。
とりあえず、migrateコマンドを打ってサーバーを起動して画面を確認しようとすると表示出来ません。
この対策としては、migrationsフォルダ内の「__init__.py」以外のファイルを削除します。
「__pycache__」フォルダは残して、その中のファイルも削除します。
とはいえ、いきなり削除は怖いので拡張子をリネーム(.pyXXXとか)しました。
これで再度makemigrationsコマンドを打って、createtableは成功しました。
その2
./manage.py maigrate
上記コマンドを打つと、ターミナルに
Running migrations: No migrations to apply
マイグレーションを適用できません。的な。
多分、テーブルにデータが残ってたりするから更新がうまくできないのだろうと推測しました。
なので、db.sqlite3ファイルの中身を全削除して0バイトファイルにします。
その後、再びmaigrateコマンドを打って
Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, ~~~
無事に適用できました。
まとめ
テーブル定義を更新してマイグレーションに失敗したら以下の通り。
- migrationsフォルダ内の「__init__.py」以外のファイルを削除
- migrationsフォルダ内、「__pycache__」フォルダは残して、その中のファイルも削除
- db.sqlite3ファイルの中身を全削除して0バイトファイルにする