在settings.py中配置多数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'users_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'users',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
},
'orders_db': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'orders',
'USER': 'postgres',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '5432',
},
}
使用数据库路由
创建routers.py文件:
class UserRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'users':
return 'users_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'users':
return 'users_db'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'users':
return db == 'users_db'
return None
在settings.py中添加:DATABASE_ROUTERS = ['path.to.routers.UserRouter']
手动指定数据库查询
使用using()方法:
User.objects.using('users_db').all()
Order.objects.using('orders_db').filter(user_id=1)
数据库迁移命令
python manage.py makemigrations users --database=users_db
python manage.py migrate users --database=users_db
实战配置完整示例
在models.py中指定数据库:
class Meta:
db_table = 'users'
app_label = 'users'
# 不需要指定数据库,路由器会处理
测试连接:
python manage.py dbshell --database=users_db
性能优化技巧
1. 使用数据库路由器自动分库
2. 读写分离配置从库
3. 连接池配置CONN_MAX_AGE = 600
4. 合理设计模型关联,避免跨库JOIN
常见问题解决
跨数据库外键:使用db_constraint=False
class Order(models.Model):
user_id = models.IntegerField()
user = models.ForeignKey('users.User', db_constraint=False)
Q: 如何测试多数据库配置是否成功?
A: 使用 python manage.py dbshell --database=你的数据库名 检查连接
Q: 迁移文件如何指定数据库?
A: python manage.py migrate 应用名 --database=数据库名
Q: 如何实现读写分离?
A: 配置slave数据库,在路由器中db_for_read返回slave,db_for_write返回master
Q: 跨数据库查询怎么处理?
A: 分别查询两个数据库,然后在Python中关联数据处理