You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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'))
    }
}

错误原因分析

  1. DATABASE_URL用户名错误:URL中写的是user,但db服务实际创建的数据库用户是mariadb
  2. 数据库引擎配置冲突:手动指定django.db.backends.mysql,但dj_database_url会根据URL前缀自动匹配引擎,两者可能冲突
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:11:29