Django 数据库配置

🗃️ 数据库是Web应用的核心

Django内置了强大的ORM系统,支持多种数据库后端。正确的数据库配置对应用性能和稳定性至关重要。

Django 数据库支持

Django官方支持以下数据库:

SQLite

默认数据库,适合开发和中小型项目

内置支持
MySQL

流行的开源关系型数据库

需要驱动
PostgreSQL

功能强大的开源关系型数据库

需要驱动

Django 数据库连接流程

1
Django应用
2
Django ORM
3
数据库驱动
4
数据库服务器

默认SQLite配置

Django默认使用SQLite数据库,无需额外配置即可使用:

# mysite/settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': BASE_DIR / 'db.sqlite3',
  }
}
💡 SQLite 特点:
  • 无需安装数据库服务器
  • 数据库存储在单个文件中
  • 适合开发和中小型应用
  • 在生产环境中可能遇到并发性能问题

配置其他数据库

MySQL 数据库配置

1. 安装MySQL数据库驱动

Django支持多个MySQL驱动:

驱动 安装命令 特点
mysqlclient pip install mysqlclient 官方推荐,性能最好
PyMySQL pip install PyMySQL 纯Python实现,兼容性好
MySQL Connector/Python pip install mysql-connector-python Oracle官方驱动
🚀 性能建议: 生产环境推荐使用 mysqlclient,它基于C扩展,性能最佳。
2. 配置 settings.py

修改数据库配置:

# mysite/settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'mydatabase',
    'USER': 'mydatabaseuser',
    'PASSWORD': 'mypassword',
    'HOST': 'localhost',
    'PORT': '3306',
    'OPTIONS': {
      'charset': 'utf8mb4',
    },
  }
}
3. 创建数据库

在MySQL中创建数据库:

mysql> CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

创建用户并授权:

mysql> CREATE USER 'mydatabaseuser'@'localhost' IDENTIFIED BY 'mypassword';
mysql> GRANT ALL PRIVILEGES ON mydatabase.* TO 'mydatabaseuser'@'localhost';
mysql> FLUSH PRIVILEGES;

PostgreSQL 数据库配置

1. 安装PostgreSQL数据库驱动

安装psycopg2驱动:

$ pip install psycopg2-binary

或者安装完整版本(需要编译工具):

$ pip install psycopg2
🚀 开发建议: 开发环境使用 psycopg2-binary,生产环境建议使用 psycopg2
2. 配置 settings.py

修改数据库配置:

# mysite/settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'mydatabase',
    'USER': 'mydatabaseuser',
    'PASSWORD': 'mypassword',
    'HOST': 'localhost',
    'PORT': '5432',
    'OPTIONS': {
      'client_encoding': 'UTF8',
    },
  }
}
3. 创建数据库

在PostgreSQL中创建数据库:

postgres=# CREATE DATABASE mydatabase;
postgres=# CREATE USER mydatabaseuser WITH PASSWORD 'mypassword';
postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydatabaseuser;

Oracle 数据库配置

1. 安装Oracle数据库驱动

安装cx_Oracle驱动:

$ pip install cx_Oracle

还需要安装Oracle Instant Client:

  • 从Oracle官网下载Instant Client
  • 解压并设置环境变量
  • 或将Instant Client放在系统PATH中
2. 配置 settings.py

修改数据库配置:

# mysite/settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.oracle',
    'NAME': 'xe', # 或连接字符串
    'USER': 'myuser',
    'PASSWORD': 'mypassword',
    'HOST': 'localhost',
    'PORT': '1521',
  }
}
⚠️ 注意: Oracle配置较为复杂,需要正确安装和配置Oracle客户端。建议在生产环境中由专业DBA协助配置。

使用环境变量配置

在生产环境中,建议使用环境变量来管理敏感信息:

1. 安装python-decouple
$ pip install python-decouple
2. 创建 .env 文件
# .env
DEBUG=True
SECRET_KEY=your-secret-key-here
DB_NAME=mydatabase
DB_USER=mydatabaseuser
DB_PASSWORD=your-password-here
DB_HOST=localhost
DB_PORT=3306
3. 修改 settings.py
# mysite/settings.py
from decouple import config

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': config('DB_NAME'),
    'USER': config('DB_USER'),
    'PASSWORD': config('DB_PASSWORD'),
    'HOST': config('DB_HOST'),
    'PORT': config('DB_PORT'),
  }
}
🔒 安全提醒: 永远不要将敏感信息(如数据库密码、SECRET_KEY)硬编码在代码中或提交到版本控制系统。

测试数据库连接

🔍 连接测试方法

配置完成后,可以通过以下方式测试数据库连接:

1. 使用Django shell测试
$ python manage.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> print("数据库连接成功!")
2. 运行数据库迁移

迁移命令会自动测试数据库连接:

$ python manage.py migrate

如果迁移成功运行,说明数据库连接正常。

3. 检查迁移状态
$ python manage.py showmigrations
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add...
auth
[X] 0001_initial
[X] 0002_alter_permission_name_max_length

高级配置选项

1. 连接池配置(MySQL)
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    # ... 其他配置 ...
    'OPTIONS': {
      'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
      'charset': 'utf8mb4',
      'use_unicode': True,
    },
    'CONN_MAX_AGE': 60, # 连接存活时间(秒)
  }
}
2. 多数据库配置
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'primary_db',
    # ... 其他配置 ...
  },
  'replica': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'replica_db',
    # ... 其他配置 ...
  }
}
3. 数据库路由

创建数据库路由类:

# myapp/db_routers.py
class PrimaryReplicaRouter:
  def db_for_read(self, model, **hints):
    return 'replica'

  def db_for_write(self, model, **hints):
    return 'default'

在settings.py中配置路由:

DATABASE_ROUTERS = ['myapp.db_routers.PrimaryReplicaRouter']

数据库性能优化

🚀 性能优化清单:
  • 使用数据库索引 - 为常用查询字段添加索引
  • 合理使用select_related和prefetch_related - 减少数据库查询次数
  • 配置连接池 - 减少连接建立开销
  • 定期清理会话数据 - 使用django-cleanseessions
  • 监控慢查询 - 使用Django Debug Toolbar
  • 数据库分区 - 对大表进行分区提高查询性能
  • 使用数据库缓存 - 缓存频繁查询的结果
查询优化示例
# 不好的写法 - N+1 查询问题
books = Book.objects.all()
for book in books:
  print(book.author.name) # 每次循环都会查询数据库

# 好的写法 - 使用select_related
books = Book.objects.select_related('author').all()
for book in books:
  print(book.author.name) # 只查询一次数据库

常见问题与故障排除

1. "django.db.utils.OperationalError" 错误

可能原因: 数据库连接失败

解决方案:

  • 检查数据库服务是否运行
  • 验证数据库名称、用户名和密码
  • 检查HOST和PORT配置
  • 确认防火墙设置
2. "django.db.utils.ProgrammingError" 错误

可能原因: 数据库或表不存在

解决方案:

  • 创建数据库:CREATE DATABASE database_name;
  • 运行迁移:python manage.py migrate
3. 字符编码问题

症状: 中文字符显示为乱码

解决方案:

  • MySQL:在OPTIONS中设置'charset': 'utf8mb4'
  • PostgreSQL:设置'client_encoding': 'UTF8'
  • 确保数据库和表使用UTF-8编码
4. 连接超时问题

症状: 长时间不操作后连接断开

解决方案:

  • 设置'CONN_MAX_AGE'控制连接存活时间
  • 使用连接池
  • 配置数据库服务器的超时设置