Django | No database selected”問題(エラー1046)を解決する具体的な手順

eyecatch-django-no-database-selected Django

DjangoとMySQLを用いた環境構築中に以下のエラーに直面しました。

Unable to create the django_migrations table ((1046, 'No database selected'))

このエラーは、データベースが正しく選択されていない状態でマイグレーションを試みた際に発生することがあります。

本記事ではエラーの背景とその解決手順について詳しく解説します。

環境

このブログ記事で取り扱うエラー解決の例は、以下の環境で行われました。

  • プログラミング言語: Python 3.11
  • フレームワーク: Django 5.0
  • データベース管理システム: MySQL 8
  • コンテナ管理: Docker

いきなり結論

このエラーの解決には、Djangoのデータベース設定の見直しと、Docker内でのデータベースの実際の状況を確認することが非常に重要でした。

Djangoの設定ファイルであるsettings.pyでデータベース名を正しく設定すること、そしてDockerで適切にデータベースが設定され、アクセスできる状態にあるかを確認することが解決への直接的なステップとなります。

エラー内容の紹介

開発中のDjangoプロジェクトでデータベースのマイグレーションを実行しようとした際にエラーが発生しました。

マイグレーション実行コマンド

python manage.py migrate

出力されたエラーメッセージ

Traceback (most recent call last):
File "/workspaces/backend/manage.py", line 22, in
main()
File "/workspaces/backend/manage.py", line 18, in main
execute_from_command_line(sys.argv)

省略...

File "/home/vscode/.local/lib/python3.11/site-packages/django/db/migrations/recorder.py", line 80, in ensure_schema
raise MigrationSchemaMissing(
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1046, 'No database selected'))

このエラーは、Djangoがデータベースマイグレーションを記録するためのテーブル django_migrations を作成できなかったことを示しています。

原因は「No database selected」というメッセージから、Djangoがデータベースに接続しているものの、操作対象とする具体的なデータベースが指定されていない状況であることが考えられます。

エラー解決の具体的なプロセス

DjangoのDATABASE設定の修正

プロジェクトのデータベース接続エラーの原因を究明するため、settings.pyファイル内のデータベース設定を見直しました。この設定ファイルはDjangoアプリケーションがデータベースとどのように通信するかを定義しており、不適切な設定は接続エラーに直接関連します。

設定を確認した結果、データベースのNAMEが指定されていないことが判明しました。これは、Djangoがどのデータベースと通信すべきかを認識できない状態を意味しています。

以下に、NAMEを追加したsettings.pyを記載します。

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'app',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'host.docker.internal',
'PORT': '53306',
'ATOMIC_REQUESTS': True,
}
}

新たなエラーが発生

データベース名の設定を修正した後、改めてマイグレーションコマンドを実行しましたが、以下の別のエラーが発生しました。

Traceback (most recent call last):
File "/workspaces/backend/manage.py", line 22, in
main()
File "/workspaces/backend/manage.py", line 18, in main
execute_from_command_line(sys.argv)

省略...

File "/home/vscode/.local/lib/python3.11/site-packages/MySQLdb/init.py", line 121, in Connect
return Connection(*args, *kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/vscode/.local/lib/python3.11/site-packages/MySQLdb/connections.py", line 195, in init super().init(args, **kwargs2)
django.db.utils.OperationalError: (1049, "Unknown database 'app'")

この問題は、指定されたデータベースappがMySQLサーバー上にまだ作成されていないために発生していました。

Djangoの設定ファイルにデータベース名を追加するだけでは不十分であり、物理的にデータベースが存在している必要があります。

このエラーは、データベースが未作成であることを示しており、次のステップで解決策を試みることにしました。

Dockerの確認とデータベースの作成

新たなエラーに対処するため、Docker上で稼働しているMySQLコンテナの状態を確認します。

以下のコマンドを使用して、現在稼働中のコンテナのリストを取得しました。

docker ps

実行結果

user@local-machine:/mnt/c/project_directory$ docker ps
CONTAINER ID   IMAGE                                       COMMAND                  CREATED          STATUS          PORTS                                NAMES
1234567890ab   mysql:8                                     "docker-entrypoint.s…"   28 minutes ago   Up 28 minutes   33060/tcp, 0.0.0.0:53306->3306/tcp   project-db-container
abcdef123456   mcr.microsoft.com/devcontainers/python:1-3.11-bookworm "bin/sh -c 'echo Co…"   6 days ago       Up 6 hours                                           python-dev-container
fedcba987654   custom-frontend-image                       "/bin/sh -c 'echo Co…"   7 days ago       Up 6 hours                                           frontend-container

このコマンドの実行結果から、MySQLデータベースを実行しているコンテナproject-db-containerが正常に稼働していることを確認しました。

次に、以下のコマンドで該当のコンテナにアクセスし、MySQLのプロンプトに入りました。

docker exec -it project-db-container bash
bash-4.4# mysql -u root -p

MySQLのプロンプトにアクセス後、データベースの存在を確認したところ、appデータベースが存在していないことが判明しました。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

これを解決するために、次のコマンドで新しいデータベースappを作成しました。

create database app;

正常に実行されると、以下のような結果が表示されます。

mysql> create database app;
Query OK, 1 row affected (0.01 sec)

データベースの作成後、再度利用可能なデータベースのリストを表示して確認し、appデータベースが正しく作成されていることを確認しました。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app                |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

再度マイグレーションコマンドを実行すると、正常にマイグレーションが実行されました。

まとめ

本記事では、Djangoプロジェクトで遭遇したデータベース関連のエラーとその解決過程を詳細に解説しました。

エラー内容

エラーは、マイグレーション実行時に「No database selected」というメッセージが表示されることから始まりました。

この問題は、Djangoのsettings.pyのDATABASES設定にデータベース名が指定されていなかったことが原因でした。

解決ステップ

  1. DATABASE設定の修正: Djangoの設定ファイルにデータベース名を追加しました。これにより、データベースが選択されていないという問題を解決しました。
  2. Dockerとデータベースの確認: Dockerコンテナ内でMySQLを確認し、appデータベースが存在しないことを確認した後、新しくデータベースを作成しました。

これらのステップを経て、最終的にはDjangoのマイグレーションが正常に実行され、エラーが解消されました。

このプロセスを通じて、Django設定の正確性と、Dockerを使用したデータベース管理の重要性が浮き彫りになりました。

この記事が、同様の問題に直面している他の開発者の助けになることを願っています。

コメント

タイトルとURLをコピーしました