Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Django】マイグレーション実行時に「sqlite3.OperationalError: table "**********" already exists」のようなエラーが出た時の対処方法


Djangoで作業をしていてマイグレーション実行時に以下のようなエラーがでることがありました。

 

この復旧にかなり手間取ったので、備忘録として残しておきます。

 

sqlite3.OperationalError: table "**********" already exists

 

"**********"の箇所は、テーブル(モデル)の名前が入っているようなメッセージです。

 

これは、モデルの変更やマイグレーションなどいろいろといじっているうちに何らかの拍子に履歴と実データの間に不整合が発生してしまったせいのようです。

 

実際にやった解決方法は以下となります。

 

(1)まず、以下を実行します。

 

python manage.py showmigrations

 

これを実行すると、マイグレーションの履歴が表示されます。

この中で、先頭から途中まで、左側に[X]が続いている履歴が続き、途中から[ ]になっていると思います。

この[ ]になっている先頭(のファイル)が問題を起こしている箇所に相当するので、そのファイルを削除するというものです。

自分は念のため?、「__init__.py」以外のファイルで、「0001_initial.py」以降の連番がついているファイルと「__pycache__」フォルダを一旦全部削除しました。

 

 

(2)

その後、

 

python manage.py dbshell

 

で、データベース操作モードに切り替えます。

正常に切り替わると以下のような表示になります。

 

(myvenv) C:\Users\hoge\>python manage.py dbshell
SQLite version 3.35.4 2021-04-02 15:20:15
Enter ".help" for usage hints.
sqlite>

 

続いて、テーブル一覧を確認します。

 

sqlite> .tables

 

登録されているテーブルがずらっと表示されると思います。

 

表示は、「app名_モデル名」のような記載になっていると思います。

その中で、エラーの原因になっているテーブルを探します。

探し出したら以下のようにそのテーブルを削除します。

 

sqlite> drop table abcdef;

 

上記の例では、「abcdef」を該当のテーブル名としています。

 

再度テーブル一覧を確認します。

 

sqlite> .tables

 

該当のテーブルが削除されていればOKです。

 

sqlite> .exit

 

でテーブル操作モードを抜けます(Ctrl+Cでも可)。

 

これで、再度マイグレーションを実行すると正常完了すると思います。

 

 

関連記事:

【Django】マイグレーション実行時に「sqlite3.OperationalError: table "**********" already exists」のようなエラーが出た時の対処方法 - Django Girls and Boys 備忘録

 

【Django】Djangoでのhtml(javascript)側からpython(views.py)側へ値を送る時の方法の一例 - Django Girls and Boys 備忘録

 

【Git】Gitのダウンロード、インストール方法 - Django Girls and Boys 備忘録

 

【Git GitHub】初心者、初級者におすすめの入門書 - Django Girls and Boys 備忘録

 

【Python Django】git init について - Django Girls and Boys 備忘録

 

【Git】ユーザー名とメールアドレスの設定方法 - Django Girls and Boys 備忘録

 

【Git】git addとステージングエリア(インデックス)への登録について - Django Girls and Boys 備忘録

 

【Git】git commitとローカルリポジトリへの登録、gitの概略イメージ - Django Girls and Boys 備忘録

 

【Git GitHub】GitHubのアカウント作成方法 - Django Girls and Boys 備忘録

 

【Git GitHub】公開鍵の設定方法 - Django Girls and Boys 備忘録

 

【Git GitHub】Gitのダウンロード、インストールから「git add」、「git commit」によるGitへの登録までの一通りの方法 - Django Girls and Boys 備忘録

 

【Git GitHub】「git add」、「git commit」後の「git push」について、リモートリポジトリにプッシュする方法 - Django Girls and Boys 備忘録

 

【Git GitHub】プルリクエストとマージを実行する方法 - Django Girls and Boys 備忘録

 

【Git GitHub】リモートリポジトリをクローンする方法 - Django Girls and Boys 備忘録

 

【Git GitHub】プルリクエスト実施後にThere isn’t anything to compare. master and update_branch are entirely different commit histories.が出た時の対応方法 - Django Girls and Boys 備忘録

 

【Git GitHub】コミット履歴の確認とコミットを元に戻す方法 - Django Girls and Boys 備忘録

 

【Git GitHub】Git、GitHubのダウンロード、インストール、「git add」、「git commit」によるGitへの登録と「git push」、マージによるGitHubのmasterへの反映とクローンまでの一通りの方法 - Django Girls and Boys 備忘録