Django 动态(多重)数据库

2 投票
1 回答
1691 浏览
提问于 2025-04-18 07:43

我的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”数据库,而每个单独的客户端数据库则是动态定义的。

撰写回答