MENU

Djangoのマイグレーションができない!?原因はvirtualenv(仮想環境)だったお話

2020 5/05
Djangoのマイグレーションができない!?原因はvirtualenv(仮想環境)だったお話

今回はDjangoのマイグレーションのお話。
Djangoでデータベースを扱う際には必ず通る機能ですね。(僕もいまいち深く理解できていませんが...ふはは)
なんとなーく、マイグレーションに関するコマンドを叩いてなんとなーくデータベースのクラスを作成し、チューニング等を行っているのだが、なんとなくの理解では不意のエラーに対応できず困るのでした。

今回はマイグレーションのエラー解決に向けて行った方法をまとめておきます。

この記事はこんな人におすすめ!!かも!?
※マイグレーションエラーが何をしても解決できない
※pythonのvirtualenv(仮想環境)を使用している

目次

マイグレーションのエラー

いつものようにマイグレーションをコマンドで行っていたのだが、

$ python manage.py makemigrations app_name
$ python manage.py migrate

どうも、うまく行かず以下のようなエラーとなった。

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0002_logentry_remove_auto_add 2, 
0003_logentry_add_action_flag_choices, 0003_logentry_add_action_flag_choices 2, 0001_initial 2 in admin; 
・・・
・・・
To fix them run 'python manage.py makemigrations --merge'

(エラー文言は長いので一部割愛しています。)

すると、以下のコマンドでfixできますよ。と提案されたので素直に打ってみたが

$ python manage.py makemigrations --merge

めっちゃエラーでるやん。全然解決できない。

・・・
ValueError: Could not find common ancestor of 
{'0002_remove_content_type_name 2', '0002_remove_content_type_name', '0001_initial 2'}

ということで、このような状況でお困りのみなさん
今回の記事が約に立ちますよ。そう願っています。

マイグレーションの初期化

もうこうなったら1回すべてリセットして1からマイグレーションをやり直そう。
ということでマイグレーションファイルを一旦リセットしてみます。

マイグレーションファイルの削除

migrationsディレクトリのあるアプリフォルダ配下で以下を実行します。

$ find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
$ find . -path "*/migrations/*.pyc"  -delete

マイグレーションファイルが削除されました。

データベースの削除

次にDBの削除も行っておきます。
db.sqlite3のあるディレクトリ配下で以下を行います。

$ rm db.sqlite3

マイグレーション履歴の削除

マイグレーション履歴も削除します。

$ python manage.py migrate --fake app_name zero

app_nameの部分は各自の環境のアプリ名に変更して下さい。

再度マイグレーション

ここまで一通りできたら、再度マイグレーションを初めから行います。

$ python manage.py makemigrations myapp
$ python manage.py migrate

これで、無事にエラー解決できましたー。
マイグレーション無事に完了です。おめでとうございます。

 

...という方が大半だとは思いますが。
僕はこれでエラー解決とはなりませんでした。

上記の方法でエラー解決されなかった方は、
ここからがこの記事の本題です。もう一歩がんばっていきましょう。

virtualenvが原因だった!?

pythonでコーディングをする際には僕はvirtualenvで仮想環境を構築するのだが、

どうやら、この仮想環境が悪さをしている場合がある。
うまくマイグレーション情報と仮想環境内の情報が噛み合わなくなることがある。
(この原因、理由は謎ですが)

ということで

仮想環境の再構築

virtualenvで構築した仮想環境ディレクトリを削除します
仮想環境ディレクトリ名は各自の環境に変更して下さい。(僕の場合はvenv)

$ rm venv

削除した後に
試しに仮想環境を構築せずにマイグレーションの初期化、実行してみた。
すると、なんとマイグレーションが成功した、エラー解決です。あっさり。
理由はよく分かりませんが。仮想環境が悪さをしていたっぽい。

仮想環境をもう一度構築し直し、無事解決です。

ということで、Djangoのマイグレーションが何をやってもうまく行かない場合は、仮想環境(virtualenv)を一旦構築し直すと良いというお話でした。

仮想環境の構築方法は以下の記事でサクッと

ばいちゃ

この記事が気に入ったら
フォローしてね!

目次
閉じる