Django 动态(多重)数据库
我的Django网站是一个为成千上万客户提供服务的门户,所以我有一个单独的“门户”数据库,这个数据库的用户表里存储了每个客户的连接参数。这些参数是动态的,可能会不时添加或删除,所以不能仅仅通过settings.py文件来管理它们。
所以,所谓的“默认”数据库是一个本地数据库,用户登录后,某些应用需要使用该用户的数据库连接参数来连接后端服务器。
我需要这些应用模型能够动态地使用用户类中的连接设置。
我看过很多关于多租户的解决方案,但这些方案并不太适合我的情况。
我知道可以给模型加上app_label,并使用自定义的数据库路由来覆盖“默认”设置,但我不太确定接下来该怎么做。
我看到可以写一个认证后的中间件,来添加到settings.DATABASES,但我觉得这样做有点冒险。
有没有更简单或更优雅的处理方式呢?
1 个回答
3
使用 django.db.connections
。它是一个包装器,用来处理你在 SETTINGS
中定义的 DATABASES
。所以你可以在中间件的某个地方获取数据库的设置,然后把连接添加到你的设置里。
from django.db import connections
# Add connection information in middleware
connections.databases['new-alias'] = { ... }
# Use like this
Test.objects.using('new-alias').all()
像这样应该可以工作。通过这种方式,你只需要在 settings.py
文件中定义“portal”数据库,而每个单独的客户端数据库则是动态定义的。