为每个用户提供自己的数据库

2024-03-29 01:16:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建我的应用程序,这样每个用户都有自己的数据库(为了方便隔离,并尽量减少切分的需要)。这意味着,每个web请求和所有后台脚本都需要连接到一个不同的数据库,该数据库基于用户发出的请求,并将该连接用于所有函数调用。你知道吗

我想我可以制作某种中间件,通过将其附加到request变量,将正确的连接传递给我的web请求,但我不知道应该如何确保请求调用的所有函数和模型方法都使用此连接。你知道吗


Tags: 中间件方法函数用户模型脚本web数据库
1条回答
网友
1楼 · 发布于 2024-03-29 01:16:45

那么,如何“确保请求调用的所有函数和模型方法都使用此连接”是很容易的。您将连接传递到api中,就像任何设计良好的代码一样,这些代码不依赖于全局变量。因此,每个请求都加载了一个数据库会话对象,并将其向下传递。对于模型对象来说,在不显式传递会话对象的情况下,很容易对该会话对象进行进一步的龟缩,因为每个托管对象都知道会话拥有它,并且您可以从那里查询它。你知道吗

db = request.db
user = db.query(User).get(1)
user.add_group('foo')

class User(Base):

    def add_group(self, name):
        db = sqlalchemy.orm.object_session(self)
        group = Group(name=name)
        db.add(group)

我不建议您使用这种模式,但它可以作为一个示例,说明如何从托管对象获取会话,避免显式地到处传递会话。你知道吗

关于你最初的问题,如何处理多租户。。。在您的数据模型中!在设计一个系统时,你要把事情分解到一个很低的层次,这是一个很大的维护负担,它不能很好地扩展。例如,当您有任意数量的独立连接时,就很难使用任何类型的连接池。为了解决这个问题,人们通常使用一些数据库支持的SQL模式特性。这允许您使用相同的连接,但每个会话可以访问不同的表结构。这样更好,但是再次强调,独立管理所有这些模式应该会引起一些危险信号,因为数据模型中存在所有重复。这一级别的任何重复都会很快成为您需要准备的负担。你知道吗

相关问题 更多 >