Help us understand the problem. What is going on with this article?

Djangoのmigrationでエラーが出た時に試したこと

More than 1 year has passed since last update.

はじめに

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番の方法では解決できないことがありました。
そんな時どうやって解決したかというと、以下の手順。


1、まずモデル定義ファイル(models.pyなど)の変更部分を元に戻す
2、その状態でmakemigraions, migrateを実行
3、変更したい部分を編集(変更後の記述に戻す)
4、その状態でmakemigraions, migrateを実行

これは力ずくなやり方な気がしますが、要はなんらかの変更が加えられたと認識させて、正常にmigrateしてから、変更したい部分を正常にmigrateするのが目的です。

終わりに

私自身はDjangoの専門家というわけではないですし、今回紹介したやり方を積極的に推奨して良い気は全くしないのですが、今までのところ、この方法で問題なくやっています。

Djangoのデータベース変更で悩んでいる初心者の方の助けになれば幸いです。

nyancook
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした