PythonとDjango3を使ってデータベース(sqlite3)にレコード登録を試すコードを実行した時にエラーが起こってデータが登録できない状況に奮闘したのでメモしておきます。
Djangoの使い方などは、このブログではまだ書いていなかったと思いますので、そのあたりはまた別にやりましょう。ここではあくまでも奮闘メモとして残しておきます。
DB登録時に発生したエラー
とりあえず、データベース登録時に発生したエラーを記載しておきましょう。次のエラーがターミナルに表示されました。
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
コード自体は何度見返しても打ち間違いなどはありませんでした。それなのにこのエラー表示。
一体、何が起こったのでしょうか?
データ登録時のコード
データ登録時のコードは、次のようなコードでした。
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ModelProject.settings')
from django import setup
setup()
from ModelApp.models import Person
p = Person(
first_name="Sae", last_name="Okazaki",
birthday="1995-11-02", email="test@example.com",
memo="オールドルーキー 真崎かほり役", web_site="https://t-tribe.co.jp/artist/sae-okazaki"
)
p.save()
コードのデータは適当です。岡崎紗絵ちゃんが最近お気に入りなのでちょっと使ってみました。
別ファイルにデータのmodelを設定して読み込んで、データ登録を実行しているという形です。
ここで上記のエラーが表示されました。
ただし、実を言うと、実際はこのコードではなかったのでした。ちょっとした VScodeの設定の悪戯にあっていたのが原因とわかりました。
エラーの原因はコードの自動整形
エラーを読むと、「設定にアクセスする前に、環境変数 DJANGO_SETTINGS_MODULE を定義するか、settings.configure() を呼び出す必要があります」というような表現があります。
そこで、自分のコードを見てみると、上記のコードが次のようになっていることに気がつきました。
from ModelApp.models import Person
from django import setup
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ModelProject.settings')
setup()
VScodeのファイルの保存に、format on save を設定しているので、コードが自動整形されて順番が入れ替わっているのでした。Pythonの環境にはautopep8をインストールしているので、その形式によってコードが整形されていることになります。
このコード整形がエラーの原因でした。自動整形の設定をOFFにすれば問題は解決するのですが、それだと他の部分のコーディングの時に楽ができません。
では、どうするか?
対応:コード整形したくない部分を # fmt: off と # fmt: on で囲む
VScodeのファイル保存時に自動整形させたくない場合は、整形したくない部分を # fmt: off と # fmt: on で囲むことで、自動整形を無視することができます。
ですから、最初のコードは次のようにすれば良いことになります。
# fmt: off
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ModelProject.settings')
from django import setup
setup()
from ModelApp.models import Person
# fmt: on
p = Person(
first_name="Sae", last_name="Okazaki",
birthday="1995-11-02", email="test@example.com",
memo="オールドルーキー 真崎かほり役", web_site="https://t-tribe.co.jp/artist/sae-okazaki"
)
p.save()
こうすることで、ファイルを保存すれば該当部分は整形されずに済みます。
コードを実行すると無事にDBにレコードを登録することができました。
まとめ
コードの自動整形は便利ですが、コードのロジックによっては整形しない方が良い場合があります。
VScodeのPythonファイル保存時の自動整形を無視したい場合は、その該当部分のコードを # fmt: off と # fmt: on で囲むことで、そこの部分はそのままのコードで保存することができます。