Django 4.2 官方推荐且稳定支持 mysqlclient,不兼容 PyMySQL:后者在高并发、长连接、MySQL 8+ 认证及管理命令中易出错,mysqlclient 为 C 扩展,性能与稳定性更优。

Django 4.2 默认不再兼容 PyMySQL(尤其在高并发或长连接场景下易抛出 InterfaceError: (0, '') 或静默断连),官方推荐且稳定支持的是 mysqlclient。直接用 PyMySQL + install_as_MySQLdb() 虽能跑通简单请求,但上线后大概率在迁移、事务或空闲连接回收时出问题。
必须用 mysqlclient,别碰 PyMySQL
虽然很多老教程教你在 __init__.py 里写 from pymysql import install_as_MySQLdb; install_as_MySQLdb(),但这在 Django 4.2 中属于“能动但不可靠”的做法:
-
mysqlclient是 C 扩展,性能和连接稳定性远超纯 Python 的PyMySQL -
PyMySQL在Django 4.2+中对 MySQL 8+ 的 caching_sha2_password 认证插件支持不完整,容易卡在连接阶段 -
manage.py dbshell、dumpdata等命令在PyMySQL下可能报NotImplementedError - Linux/macOS 安装
mysqlclient需先装系统级依赖:sudo apt-get install python3-dev default-libmysqlclient-dev(Ubuntu/Debian)或brew install mysql-client+pip install mysqlclient(macOS)
settings.py 的 DATABASES 配置关键项
以下字段缺一不可,且顺序/类型敏感:
-
'ENGINE'必须是'django.db.backends.mysql',不能写成'mysql'或漏掉django.db.backends. -
'PORT'类型必须是int(如3306),写成字符串'3306'会导致OperationalError: Can't connect to MySQL server -
'OPTIONS'建议显式加上字符集和 SQL 模式,避免中文乱码或严格模式报错:'OPTIONS': { 'charset': 'utf8mb4', 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" } - MySQL 8+ 用户必须确认服务端默认认证插件不是
caching_sha2_password;若无法改服务端,可在OPTIONS中加'auth_plugin': 'mysql_native_password'
第一次 migrate 前必须检查的三件事
跑 python manage.py migrate 报错,90% 出在这三个地方:
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 数据库
NAME对应的库是否已手动创建?Django不会自动建库,必须先用mysql -u root -p -e "CREATE DATABASE myproject DEFAULT CHARSET=utf8mb4;" -
USER是否有该库的SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER权限?仅USAGE权限不够 -
HOST值是否正确?本地开发用'127.0.0.1'(走 TCP),不用'localhost'(MySQL 会优先走 socket,可能权限路径不同)
DEFAULT_AUTO_FIELD 和 MySQL 8+ 的主键兼容性
如果用的是 MySQL 8.0.30+,且表里已有自增主键,务必在 settings.py 底部加这一行:
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
原因:
- MySQL 8.0.30+ 对
AUTO_INCREMENT列的默认行为更严格,AutoField(32 位)在数据量大时可能溢出 -
Django 4.2默认将DEFAULT_AUTO_FIELD设为BigAutoField,但旧项目升级时不会自动补上,导致新建模型迁移失败 - 这个设置只影响新生成的模型主键,不影响已有表结构,但后续所有
makemigrations都会按此规则生成
MySQL 连接看似就几行配置,但真正卡住人的永远是那些“没报错但就是连不上”“能连上但 migrate 失败”“admin 页面空白”的隐性条件——尤其是 mysqlclient 编译依赖、字符集声明、认证插件匹配这三点,漏一个都得花半小时翻日志。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










