最常见的失败是PORT写成字符串或漏掉ENGINE;ENGINE必须为'django.db.backends.mysql',PORT必须是整数3306;本地HOST用'127.0.0.1'而非'localhost';PyMySQL需在__init__.py中patch;环境变量缺省值勿设空字符串。

MySQL 连接配置写错端口或引擎会直接报 OperationalError
最常见的失败不是密码错,而是 PORT 写成字符串(比如 '3306')或者漏掉 ENGINE。Django 默认用 django.db.backends.sqlite3,不显式指定 MySQL 引擎就会连 SQLite,但表结构建不起来,后面 migrate 时才爆 OperationalError: (1045, "Access denied...") 或 (2003, "Can't connect to MySQL server")。
-
ENGINE必须是'django.db.backends.mysql'(注意不是mysqldb或pymysql) -
PORT必须是整数,3306,不能加引号 - 如果用
mysqlclient(推荐),确保已装:pip install mysqlclient;用PyMySQL需在__init__.py中 patch(见下一条) - 本地开发常用
HOST是'127.0.0.1',别写'localhost'—— MySQL 对这两者解析不同,'localhost'会走 socket,容易连不上
PostgreSQL 的 NAME 和 USER 必须真实存在,且权限要开
Django 不创建数据库、不建用户,它只连。所以 NAME 填的是库名,不是文件路径;USER 是 PostgreSQL 里的角色(role),不是系统用户名。连不上时大概率是:psql -U postgres 能进,但 psql -U your_user -d your_db 报 password authentication failed 或 database "xxx" does not exist。
-
NAME必须是已用createdb your_db创建好的库名 -
USER必须已用createuser -P your_user创建,并赋予CREATEDB权限(migrate 需要) -
PASSWORD是该用户的密码,不是系统密码,也不是 pg_hba.conf 里设的认证方式 - 默认
PORT是5432,别漏;HOST如果是本地,填'127.0.0.1'比'localhost'更稳
用 PyMySQL 代替 mysqlclient 时,必须在 __init__.py 里 import 并 monkey patch
因为 mysqlclient 是 C 扩展,PyMySQL 是纯 Python 实现,Django 默认不认识它。不 patch 就算 ENGINE 写对了,启动时也会报 ModuleNotFoundError: No module named 'MySQLdb' —— Django 底层还是在找 MySQLdb。
- 在项目根目录的
__init__.py(不是 settings.py)中加两行:
import pymysql pymysql.install_as_MySQLdb()
pymysql:pip install PyMySQL
mysqlclient,性能和稳定性差一截
DATABASES 里混用环境变量时,os.getenv() 缺省值别设空字符串
很多人用 os.getenv('DB_NAME', ''),结果 NAME 变成空串,Django 会试图连一个叫 '' 的库,报 OperationalError: database "" does not exist。更糟的是,有些环境变量没配全,但代码没报错,直到 migrate 或 runserver 才崩。
- 用
os.getenv('DB_NAME')不带默认值,让它返回None,然后显式检查: - 例如:
NAME = os.getenv('DB_NAME') or 'myproject_dev' - 密码字段尤其不能设空默认值,否则连空密码库,安全风险
- 推荐用
django-environ管理,但哪怕不用,也至少用assert卡住关键字段:assert os.getenv('DB_PASSWORD'), 'DB_PASSWORD required'










