はじめに
Pythonで、ある程度しっかりした(データベースを含めた)webアプリケーションを作ろうと思ったら、Djangoが選択肢に入ってくると思います。
Djangoはデータベースの変更や追加の作業が楽にできる仕組みが備わっていますが、エラーが発生した場合は、どのように対処すれば良いのか途方に暮れてしまいそうになることも多々あるのではないでしょうか?
最終的に、直接データベースをいじってやるしか解決策がない場合もあるのかもしれませんが、僕は今までのところ、そうせずになんとか解決してきました。
「もうイラつくから、python manage.py flushで全て消し去ってやる!」と実行に移す前に試してみると、もしかしたら解決するかもしれない、そんな方法を2つ紹介します。
1、migrations/以下のファイルを削除する
そもそも
python manage.py makemigrations
python manage.py migrate
で、それぞれ何が行われているかというと、基本的には
python manage.py makemigrations
で、まず現在のデータベースの状態との差分をまとめたファイルを
プロジェクトディレクトリ / 各appディレクトリ / migrations /
以下に作成し、次に
python manage.py migrate
で、先ほどのファイルの中身を元に、データベースの変更を実行する、という流れだと思います。
データベースに対してどのような操作が行われる予定なのかは、makemigrationsした後に
migrations/
以下のファイルの中身をのぞいてみれば、なんとなくわかるはずです。
差分ファイルを作成する際になんらかの原因で、現状が正しく反映されていない差分ファイルが作成されてしまうと、migrateを実行してもエラーが起こってしまいます。
なので、自分の意図した通りにdbを変更したいなら、差分ファイルを直接編集してしまえば良い(これも解決策の1つ)のですが、結構めんどくさいと思います。
もちろん、他にやりようがなく、これで解決できるならその手間なんて惜しくない!という状況ならアリですが、その前に以下のことを試してみる価値があると思います。
すなわち、
migrations/ 以下の、__init__.py以外のファイルを削除してから、makemigrations, migrateを再実行する
ことです。
migrations/ 以下の差分ファイルを削除してしまえば、makemigrationsした際に正しく差分ファイルが作成される可能性があるので、そこに期待しようというわけです。
2、models.py(もしくはmodels/any_table.py)の変更部分を元に戻す→変更後に戻す
Unknown column 'なんちゃら' in 'field list'
特に上記のようなエラーが出た時はこの手段で解決するかもしれません。
考え方としては先ほどと似ていて、できることなら正しい差分ファイルを自動で作り直してもらうことを狙っています。
このエラーが出た時は、1番の方法では解決できないことがありました。
そんな時どうやって解決したかというと、以下の手順。
これは力ずくなやり方な気がしますが、要はなんらかの変更が加えられたと認識させて、正常にmigrateしてから、変更したい部分を正常にmigrateするのが目的です。
終わりに
私自身はDjangoの専門家というわけではないですし、今回紹介したやり方を積極的に推奨して良い気は全くしないのですが、今までのところ、この方法で問題なくやっています。
Djangoのデータベース変更で悩んでいる初心者の方の助けになれば幸いです。