【Django】no such tableのエラー
こんにちは
今日はDjangoで以下のような「no such table」のエラーが出たときの解決法について書かせていただきます。
忘備録も兼ねて。
【目次】
エラーが出た経緯
Pythonをインストールして、出来るだけWEBアプリに近い状態から始めたいのでDjangoを弄ってる最中です。
あるページを参考に簡単な投稿フォームアプリを作成しておりました。
しかし指示通りにコードを埋めたにも関わらず、ローカルサーバーで実行すると以下のようなエラーページが出たのです。
プロジェクト、もしくはアプリで不正・無効の記述があるとき、本来であればサーバーで実行する前にエラーが出るはずななんですけど何も起こりませんでした。
原因の模索
Exception Location: c:\Python\django\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 396
まずこちらの記述をもとにbase.pyの396行目を確認しました。
return Database.Cursor.execute(self, query, params)
しかしこのような記述があるだけで特におかしいと思われる箇所はないのです。
それでネットで「no such table」のエラーを調べると、海外フォーラムで同じ悩みを持った人の投稿を見つけました。
python - Django - No such table: main.auth_user__old - Stack Overflow
解決策を日本語に翻訳すると以下のように
次の手順を維持することで、この問題を簡単に解消できます。
①djangoバージョン2.1.5を維持(このバージョンで対処された問題) pip install django==2.1.5
②SQLiteデータベースを削除する
③再び移行しpython manage.py makemigrationsた後、python manage.py migrate
④サーバーを起動する python manage.py runserver
やった!
要はデータベースのバージョンに関するエラーだったようです。
エラー解決!
結論から言うとpipのバージョンを上げれば解決できました。
まず解決手順①でpipのバージョンを調査。
(django) C:\Python\…>pip install django Requirement already satisfied: django in c:\python\django\lib\site-packages (3.0.6) Requirement already satisfied: pytz in c:\python\django\lib\site-packages (from django) (2020.1) Requirement already satisfied: sqlparse>=0.2.2 in c:\python\django\lib\site-packages (from django) (0.3.1) Requirement already satisfied: asgiref~=3.2 in c:\python\django\lib\site-packages (from django) (3.2.7) WARNING: You are using pip version 19.2.3, however version 20.1.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
あなたのpipのバージョンは19.2.3ですけど、バージョン20.1.1が入手可能です。
「python -m pip install --upgrade pip」コマンドでアップグレードしてください。
と、表示されましたので大人しくpipのバージョンを上げます。
(django) C:\Python\django…>python -m pip install --upgrade pip … Successfully installed pip-20.1.1
次にmakemigrationsを実行します。
makemigrationsとは文字通りマイグレーションファイルを作成するコマンドです。
さらに言うとマイグレーションファイルというのはmodelの変更をデータベースに反映させるためのものです。
そもそも「no such table」のエラーを解決していたのですけども、やはりデータベース関連のエラーだと分かりますね。
(django) C:\Python\django…>python manage.py makemigrations Migrations for '〇〇〇app': 〇〇〇app\migrations\0001_initial.py - Create model PostModel
あとは「python mange.py migrate」を実行すれば無事アプリを起動することができました。
(django) C:\Python…python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: No migrations to apply. Your models have changes that are not yet reflected in a migration, and so won't be applied. Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.