对于大多数 Django 生产项目,官方更推荐 PostgreSQL,尤其是在需要复杂查询、JSON 字段或地理信息支持的场景;如果团队对 MySQL 更熟悉且业务主要是简单的增删改查,MySQL 也是稳定可行的选择。
先说结论:PostgreSQL 功能更完备且与 Django 集成度更高,但 MySQL 在简单 Web 应用场景下依然稳定高效。
- 适合 PostgreSQL:复杂业务逻辑、需要 JSONField 高级特性、地理信息系统 (GIS)、高并发写入
- 适合 MySQL:简单 CRUD 业务、团队技术栈偏好、读多写少场景
- 关键配置:注意 Django 版本对 JSONField 的支持差异(3.1 为分水岭)及连接池设置
核心场景对比
选型前建议对照以下特性表,避免后期迁移成本:
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| Django 集成度 | 最高(官方首选) | 高(广泛使用) |
| JSON 字段支持 | 原生支持,功能强大 | Django 3.1+ 支持 |
| 地理信息 (GIS) | PostGIS 支持完善 | 支持有限 |
| 连接模型 | 多进程(开销较大) | 多线程(轻量) |
| 全文搜索 | 内置强大 | 需配合 Elasticsearch 等 |
实操配置步骤
1. 安装数据库驱动
根据选择的数据库安装对应的 Python 驱动包:
# PostgreSQL 驱动
pip install psycopg2-binary
# MySQL 驱动
pip install mysqlclient2. 创建数据库实例
Django 不会自动创建数据库实例,需手动在数据库管理中创建。注意字符集设置:
-- PostgreSQL
CREATE DATABASE mydb OWNER myuser ENCODING 'UTF8';
-- MySQL (务必使用 utf8mb4)
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;3. 配置 settings.py
修改 DATABASES 配置项,以下是生产环境推荐的最小化配置示例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql', # 或 django.db.backends.mysql
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'your_secure_password',
'HOST': 'localhost',
'PORT': '5432', # MySQL 默认 3306
'CONN_MAX_AGE': 600, # 启用持久连接,减少握手开销
'OPTIONS': {
# MySQL 特定配置
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4',
}
}
}4. 执行迁移
python manage.py migrate验证与测试
配置完成后,通过以下步骤验证连接及功能是否正常:
- 连接验证:运行 python manage.py dbshell 能成功进入数据库命令行。
- 表结构验证:登录数据库客户端,检查 django_migrations 表是否存在。
- 功能验证:在 Django Shell 中创建包含 JSON 字段或事务的模型实例,确认无报错。
- 日志检查:观察应用启动日志,确认无 OperationalError 或连接超时警告。
常见风险与排查
1. 连接池与性能开销
PostgreSQL 每个连接对应一个操作系统进程,高并发下开销较大。生产环境建议:
- 设置 CONN_MAX_AGE 启用 Django 内置持久连接。
- 高并发场景建议在前端部署 pgBouncer 进行连接池管理。
- MySQL 虽为线程模型,但也建议配置连接池避免频繁握手。
2. JSONField 版本兼容
Django 3.1 版本之前,MySQL 后端不支持 JSONField。若项目需使用该字段且版本低于 3.1,必须选择 PostgreSQL 或升级 Django 版本。
3. 字符集乱码问题
MySQL 务必使用 utf8mb4 而非 utf8,后者最多支持 3 字节,无法存储 emoji 等特殊字符。创建库时需显式指定。