Django 4.2 生产环境必须使用 mysqlclient 或 psycopg2,因 pymysql 是纯 Python 实现,缺乏 C 扩展驱动对事务隔离、连接池、prepared statement 等关键机制的支持,易导致死锁不回滚、select_for_update 锁失效等隐性数据问题。

Django 4.2 必须用 mysqlclient 或 psycopg2 才能连 MySQL/PostgreSQL;pymysql 虽可运行,但不被官方支持、无事务隔离保障、上线后容易出隐性数据问题。
为什么不能直接 pip install pymysql 然后 ENGINE 设为 mysql?
因为 Django 4.2 的数据库层依赖 C 扩展驱动的底层行为(如连接池管理、prepared statement 处理、autocommit 控制),而 pymysql 是纯 Python 实现,绕过了这些关键机制。常见表现包括:
- 并发写入时出现
IntegrityError: (1213, 'Deadlock found when trying to get lock')却无法回滚 -
transaction.atomic()块内部分语句成功、部分失败,但外层未感知异常 - 使用
select_for_update()时锁行为不符合预期,尤其在高并发读写场景
这不是配置问题,是驱动能力缺失 —— pymysql 在 Django 4.2 中仅适合本地开发快速验证模型结构,不可用于生产环境。
mysqlclient 安装失败的 3 个高频原因和解法
绝大多数报错都卡在编译环节,核心是缺系统级依赖,不是 Python 包本身问题。
- Linux(Ubuntu/Debian):缺
python3-dev和default-libmysqlclient-dev,运行sudo apt-get install python3-dev default-libmysqlclient-dev build-essential - macOS(M1/M2):Homebrew 安装的 MySQL 默认路径不对,需先执行
export PATH="/opt/homebrew/opt/mysql/bin:$PATH",再pip install mysqlclient - Windows:不要用预编译 wheel 失败的版本,直接下载对应 Python 版本和架构的
.whl文件(如mysqlclient‑2.2.4‑cp311‑cp311‑win_amd64.whl),然后pip install xxx.whl
装完后验证:在 Python shell 中执行 import MySQLdb 不报错,才算真正就绪。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
psycopg2 编译慢或报错 libcrypt.so.1 missing 怎么办
psycopg2 默认源码编译,耗时且易失败;推荐优先用 psycopg2-binary,它自带预编译二进制,Django 4.2 完全兼容。
- 执行
pip install psycopg2-binary(注意结尾是-binary) - settings.py 中仍保持
'ENGINE': 'django.db.backends.postgresql',无需改其他配置 - 若部署在 Alpine Linux(如 Docker),则必须用源码版
psycopg2,并提前安装postgresql-dev gcc musl-dev
⚠️ 注意:psycopg2-binary 不可用于 FIPS 合规环境,但绝大多数 Web 服务不需要这个限制。
DATABASES 配置里最容易漏掉的两个键
很多人只填了 ENGINE/NAME/USER/PASSWORD,结果连上库却查不出数据,其实是下面两项没设对:
-
'OPTIONS': {'init_command': "SET TIME_ZONE='+08:00'"}(MySQL)——否则DateTimeField存入值可能比实际时间少 8 小时 -
'OPTIONS': {'options': '-c search_path=public'}(PostgreSQL)——否则多 schema 场景下migrate可能建表到错误 schema
这两项不是可选优化项,而是直接影响数据一致性的必要配置,尤其当数据库服务器的全局时区或默认 schema 与 Django 应用逻辑不一致时。
真正麻烦的从来不是“能不能连上”,而是连上了之后,事务边界、时区偏移、字符集隐式转换这些看不见的链路是否可靠 —— 这些细节在本地开发几乎不暴露,一上生产流量就集中爆发。


















