问题现象
在 Django 4.2 + MySQL 8 项目中,明明已经通过pip安装了mysqlclient 2.2.x,requirements.txt中版本也完全正确,但在执行runserver或migrate时,仍然报错:mysqlclient 1.4.3 or newer is required; you have 1.0.2。该错误极具迷惑性,容易让人误以为是依赖未安装或环境未生效。
真实原因
问题并不在 mysqlclient,而在于项目中存在import pymysql; pymysql.install_as_MySQLdb()。这行代码会让 Django 忽略 mysqlclient,转而使用 PyMySQL 伪装成MySQLdb。而 PyMySQL 的默认版本号是 1.0.2,Django 检测到的正是这个版本,于是误判为“mysqlclient 版本过低”,即使 mysqlclient 已正确安装也毫无作用。
为什么 MySQL 8 更容易出问题
很多旧教程为了省去编译步骤,推荐使用 PyMySQL,但 Django 4.x 官方已明确推荐 mysqlclient 作为 MySQL 后端驱动。MySQL 8 对驱动兼容性更严格,PyMySQL 在外键、迁移、字符集等方面更容易踩坑,因此在新环境中更容易触发这类“版本错判”的问题。
最终解决办法
彻底删除或注释掉所有 PyMySQL 相关代码,卸载pymysql,只保留mysqlclient,并使用 Django 默认的 MySQL 后端配置。这样 Django 会自动加载 mysqlclient,版本检测恢复正常,MySQL 8 环境下的迁移与运行问题也会一次性解决。一句话:删 PyMySQL,用 mysqlclient,别混用。