解决django.db.utils.OperationalError(1046,未选择数据库)及DATABASE_URL配置问题
解决Django执行migrate时的数据库未选择错误
问题场景
执行python manage.py migrate时触发错误:django.db.utils.OperationalError: (1046, 'No database selected'),目标通过docker-compose.yml中的DATABASE_URL完成数据库配置,相关操作记录与配置如下:
数据库操作记录
mysql> show databases; +--------------------+ | Database | +--------------------+ | DatabaseUBU | | information_schema | | mariadb | | mydb | | mysql | | performance_schema | | sys | +--------------------+ 7 rows in set (0.02 sec) mysql> create database mariadb; ERROR 1007 (HY000): Can't create database 'mariadb'; database exists
docker-compose.yml配置
version: '3.7' services: db: image: mariadb:10 command: --default-authentication-plugin=mysql_native_password restart: always environment: - MYSQL_ROOT_PASSWORD=mariadb - MYSQL_DATABASE=mariadb - MYSQL_USER=mariadb - MYSQL_PASSWORD=mariadb - MARIADB_ROOT_PASSWORD=mysecretpassword ports: - 3306:3306 volumes: - "mysqldata:/var/lib/mysql" web: build: . restart: always command: python manage.py runserver 0.0.0.0:8000 environment: - DATABASE_URL=mariadb+mariadbconnector://user:mariadb@db:3306/mariadb ports: - "8000:8000" depends_on: - db volumes: mysqldata:
settings.py配置
import dj_database_url import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', **dj_database_url.config(default=os.environ.get('DATABASE_URL')) } }
错误原因分析
- DATABASE_URL用户名错误:URL中写的是
user,但db服务实际创建的数据库用户是mariadb - 数据库引擎配置冲突:手动指定
django.db.backends.mysql,但dj_database_url会根据URL前缀自动匹配引擎,两者可能冲突 - db服务环境变量冗余:同时设置
MYSQL_ROOT_PASSWORD和MARIADB_ROOT_PASSWORD,导致配置混乱
修复步骤
1. 修正DATABASE_URL的用户名
将web服务的DATABASE_URL中的用户名从user改为mariadb,正确配置如下:
mariadb+mariadbconnector://mariadb:mariadb@db:3306/mariadb
2. 调整settings.py的数据库配置
去掉手动指定的ENGINE,让dj_database_url自动根据URL前缀配置引擎,避免冲突:
import dj_database_url import os DATABASES = { 'default': dj_database_url.config(default=os.environ.get('DATABASE_URL')) }
若需强制指定引擎,需保证与URL前缀匹配:使用mariadb前缀对应django.db.backends.mysql即可。
3. 清理db服务的冲突环境变量
删除重复的MARIADB_ROOT_PASSWORD,保留MYSQL_ROOT_PASSWORD即可:
environment: - MYSQL_ROOT_PASSWORD=mariadb - MYSQL_DATABASE=mariadb - MYSQL_USER=mariadb - MYSQL_PASSWORD=mariadb
4. 重启服务并重新执行migrate
停止当前容器:
docker-compose down
(可选)若需重置数据库,删除旧数据卷:
docker-compose down -v
重新构建并启动服务:
docker-compose up --build
在web容器中执行migrate:
docker-compose exec web python manage.py migrate
内容的提问来源于stack exchange,提问作者wanx
相关产品推荐
相关产品推荐

