Django多数据库配置文件实战教程,轻松链接多个数据库,解决数据处理瓶颈,提升开发效率

文章导读
在settings.py中配置多数据库:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', }, 'users_db': { 'ENGINE': 'django.db.backends.mys
📋 目录
  1. 使用数据库路由
  2. 手动指定数据库查询
  3. 数据库迁移命令
  4. 实战配置完整示例
  5. 性能优化技巧
  6. 常见问题解决
A A

在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

Django多数据库配置文件实战教程,轻松链接多个数据库,解决数据处理瓶颈,提升开发效率

实战配置完整示例

在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)

Django多数据库配置文件实战教程,轻松链接多个数据库,解决数据处理瓶颈,提升开发效率

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中关联数据处理