第5章:数据库操作
5.1 Django 数据库配置
支持的数据库
Django官方支持多种数据库后端:
- PostgreSQL - 通过
django.db.backends.postgresql - MySQL - 通过
django.db.backends.mysql - SQLite - 通过
django.db.backends.sqlite3 - Oracle - 通过
django.db.backends.oracle
数据库连接配置
在 settings.py 中配置数据库:
python
# SQLite 配置示例
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# PostgreSQL 配置示例
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
# MySQL 配置示例
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}配置参数说明
- ENGINE: 数据库后端引擎
- NAME: 数据库名称(SQLite中是文件路径)
- USER: 数据库用户名
- PASSWORD: 数据库密码
- HOST: 数据库主机地址
- PORT: 数据库端口
- OPTIONS: 额外的数据库选项
多数据库配置
Django支持配置多个数据库连接:
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'primary_db',
# ... 其他配置
},
'read_replica': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'replica_db',
# ... 其他配置
},
'analytics': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'analytics_db',
# ... 其他配置
}
}数据库路由
对于多数据库配置,可以使用数据库路由来控制数据读写:
python
# 在 settings.py 中配置数据库路由
DATABASE_ROUTERS = ['path.to.PrimaryReplicaRouter']
# 数据库路由示例
class PrimaryReplicaRouter:
def db_for_read(self, model, **hints):
return 'read_replica'
def db_for_write(self, model, **hints):
return 'default'
def allow_relation(self, obj1, obj2, **hints):
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
return db == 'default'环境变量配置
在生产环境中,建议使用环境变量来配置数据库:
python
import os
from pathlib import Path
# 从环境变量获取配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME', 'mydatabase'),
'USER': os.getenv('DB_USER', 'myuser'),
'PASSWORD': os.getenv('DB_PASSWORD', 'mypassword'),
'HOST': os.getenv('DB_HOST', 'localhost'),
'PORT': os.getenv('DB_PORT', '5432'),
}
}测试数据库配置
python
# 测试环境数据库配置
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}连接池配置
对于生产环境,可以考虑使用连接池:
python
# 使用 django-db-connections 进行连接池配置
DATABASES = {
'default': {
'ENGINE': 'django_db_connections.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
'OPTIONS': {
'pool_size': 20,
'max_overflow': 10,
'timeout': 30,
}
}
}最佳实践
- 使用环境变量:不要在代码中硬编码数据库凭据
- 开发环境使用SQLite:便于开发和测试
- 生产环境使用PostgreSQL:功能更强大,性能更好
- 配置连接池:提高数据库连接效率
- 定期备份:确保数据安全
- 监控数据库性能:使用Django Debug Toolbar等工具
常见问题解决
连接超时问题:
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
# ... 其他配置
'OPTIONS': {
'connect_timeout': 10,
}
}
}字符集问题:
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# ... 其他配置
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET NAMES 'utf8mb4'",
}
}
}小结
数据库配置是Django应用的重要基础:
- ✅ 支持多种数据库后端(PostgreSQL、MySQL、SQLite、Oracle)
- ✅ 灵活的单数据库和多数据库配置
- ✅ 通过环境变量保护敏感信息
- ✅ 使用数据库路由实现读写分离
- ✅ 配置连接池提高性能
合理的数据库配置能够确保应用的稳定性、安全性和性能表现。
下一篇
我们将学习Django的迁移系统,了解如何管理数据库模式变更。