django 4.2 强制使用 mysqlclient 驱动,禁用 pymysql;port 必须为 int 类型,databases 需显式配置 utf8mb4 字符集、strict_trans_tables 模式及连接池回收参数。

Django 4.2 本身没有为 MySQL 新增专属性能特性,它对 MySQL 的优化路径仍是围绕稳定连接、合理查询和底层驱动控制展开。所谓“新功能增强性能”,实际是更严格地淘汰不安全方案、强化推荐实践——比如彻底放弃 PyMySQL 的兼容性兜底,强制转向 mysqlclient;同时对连接参数、字符集、SQL 模式等关键项提出显式要求。不按这套规则来,连基础迁移都可能失败。
必须用 mysqlclient,别碰 PyMySQL
PyMySQL 在 Django 4.2 中已不是“可用即可”,而是明确不可靠:高并发下易抛 InterfaceError: (0, ''),manage.py dbshell 和 dumpdata 可能直接报 NotImplementedError,MySQL 8+ 的 caching_sha2_password 认证也支持不全。
正确做法:
- Linux/macOS 先装系统依赖:
sudo apt-get install python3-dev default-libmysqlclient-dev(Ubuntu/Debian)或brew install mysql-client+pip install mysqlclient(macOS) - 验证安装:
python -c "import MySQLdb; print('OK')" - 删掉项目
__init__.py里任何from pymysql import install_as_MySQLdb类代码——这不是兼容,是埋雷
DATABASES 配置中 PORT 必须是 int,不是字符串
写成 'PORT': '3306' 看似无害,但会触发 OperationalError: Can't connect to MySQL server。Django 4.2 的 MySQL 后端在解析连接参数时对类型更敏感。
正确写法(注意类型):
'PORT': 3306, # ✅ int # 而不是 'PORT': '3306' ❌
其他关键项也不容省略:
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
-
'ENGINE'必须为'django.db.backends.mysql'(漏掉django.db.backends.前缀会静默 fallback 到 SQLite) -
'OPTIONS'建议显式声明:'charset': 'utf8mb4'(避免中文乱码)、'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"(防止隐式类型转换出错) - MySQL 8+ 用户若无法改服务端认证插件,必须加
'auth_plugin': 'mysql_native_password'
第一次 migrate 前必须手动建库,且检查三件事
Django 从不自动创建数据库(NAME 对应的库),这是最常卡住新手的地方。报错说 “Unknown database”,不是配置错,是库根本不存在。
执行前确认:
- 用
mysql -u root -p -e "CREATE DATABASE myproject CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"手动建库(带字符集,避免后续迁移失败) - 数据库用户(
USER)对这个库有ALL PRIVILEGES,不是只给 localhost 权限(远程 DB 时常见) -
python manage.py dbshell能连上,说明网络、账号、密码、端口全部通——这步比migrate更早暴露问题
连接池不能靠 ORM 自带,得用 django-db-connection-pool
Django 自身不提供连接池,长连接复用全靠数据库驱动层(mysqlclient)的默认行为,但默认不回收空闲连接,容易耗尽 MySQL 的 max_connections。
生产环境必须引入连接池:
pip install django-db-connection-pool-
ENGINE改为'django_db_connection_pool.backends.mysql' -
POOL_OPTIONS至少设'POOL_SIZE': 10和'RECYCLE': 300(5 分钟强制回收,防连接老化) -
MAX_OVERFLOW不建议超 5,否则可能突破 DB 侧限制,引发拒绝连接
注意:RECYCLE 是关键——很多线上慢查询,根源是用了 stale connection(例如 MySQL 服务端 kill 了空闲超时连接,而 Django 还在用)。
真正影响性能的从来不是 Django 版本号里的“4.2”,而是你有没有让连接稳住、让查询走索引、让空闲连接及时释放。mysqlclient + 显式字符集 + 连接池回收,这三样缺一不可。其他所有“优化”都建立在这之上。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










