今回は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)を一旦構築し直すと良いというお話でした。
仮想環境の構築方法は以下の記事でサクッと
ばいちゃ
Djangoについて学びたい方へ
書籍で学びたいなら
DjangoのWebアプリの設計・作成はもちろん、Webサーバー・アプリ周りの知識も幅広く扱ってくれています。データベースの知識、クラウドの知識、セキュリティの知識も同時に習得でき、初心者にはぜひおすすめの書籍
Djangoについて深く知りたいという方におすすめしています。
ややプログラミングの知識がないと理解が難しいかもしれません。
pythonが書ける方には非常にタメになるDjangoアプリ開発におすすめ書籍でした。
オンライン授業で学びたいなら
僕はオンラインスクールはUdemy をおすすめします。定番の授業からマニアックな授業まで幅広く扱っているので、学びたいことは大体あります。今回はPython+Djangoの授業をおすすめします。Djangoの基礎から応用までこの授業で学べます。
実際にWEBアプリを作成し、公開するところまで親切に教えてくれます。
【徹底的に解説!】Djangoの基礎をマスターして、3つのアプリを作ろう!
コメント