①はじめに
pythonを使ったwebアプリを作成するためにDjangoを利用して、ブログを作成していたのですが、エラーが出たので共有いたします。他のエラーを解決する方法にもなると思うので、困っている方は試してみてください。②エラー内容
ブログの機能としてログイン機能を入れており、デフォルトではユーザー名でログインしますが、ユーザーモデルをカスタマイズして、メールアドレスでログインできるように認証で便利なallauthパッケージを利用しました。 モデルを変更し、python3 manage.py migrateでデータをセットアップした際に出たエラーが下記になります。python
django.db.utils.OperationalError: no such table: app_category
または
python
sqlite3.OperationalError: no such table: app_category
上記エラーは、データベース上にapp_categoryというテーブル(データ)が入っていないという意味になります。
app_categoryのappは私が設定したappというフォルダ名で、categoryは私が設定したclass名です。
つまり、下記のようになります。
python
sqlite3.OperationalError: no such table: ファイル名_クラス名
③解決方法
1.db.sqlite3ファイルを削除 2.pythonファイルの「category」が入っているコードを全てコメントアウトします。(モデルのファイルだけでもいいかも) 3.モデルのコメントアウトした「category」を元に戻します。 4.次に、データベースを再作成します python3 manage.py makemigrations をターミナルに入力すると下記のようなメッセージが出ます。「デフォルトなしで投稿するために、null許容でないフィールド「category」を追加しようとしています。修正を選択してください:」というようなメッセージが出る場合があります。その時は選択肢1を入力し、次の画面でデフォルト値として適当な数字(1でok)を入れます。You are trying to add a non-nullable field 'category' to post without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> 1
Migrations for 'app':
app/migrations/0006_auto_20210318_2344.py
- Create model Category
- Add field category to post
categoryモデルを作成することができたら
python3 manage.py migrate をターミナルに入力しデータをセットアップます。
Operations to perform:
Apply all migrations: account, accounts, admin, app, auth, contenttypes, sessions, sites, socialaccount
Running migrations:
Applying app.0006_auto_20210318_2344... OK
5.エラーが無ければ他のファイルでコメントアウトしたコードを元に戻します。python3 manage.py runserverでアプリページに移動し問題ければ成功です。
エラーがあった場合はモデルの「category」のあるコードをコメントアウトし、一つずつコメントを解除し、エラーの原因を探っていくと解決できるはずです。