如何处理为多租户web应用程序动态创建架构/表



问题

我正在构建一个网络应用程序,每个用户都需要有隔离的数据(由于保密性(,但数据结构/表完全相同。

环顾四周,我觉得这个概念叫做多租户?似乎一个好的解决方案是每个租户有一个模式。

我认为sqlalchemy 1.1通过实现了一些对此的支持

session.connection(execution_options={
"schema_translate_map": {"per_user": "account_one"}})

然而,这似乎是假设已经创建了模式和表。

我不确定我会有多少租户,所以我需要在创建用户帐户时动态创建模式和其中的表。

解决方案

我想到的感觉有点像黑客,这就是为什么我在这里发帖,看看是否有更好的解决方案。

为了在运行中创建模式,我使用

if not engine.dialect.has_schema(engine, user.name):
engine.execute(sqlalchemy.schema.CreateSchema(user.name))

然后直接用创建表格

table = TableModel()
table.__table__.schema = user.name
table.__table__.create(db.session.bind)

TableModel定义为

class TableModel(Base):
__tablename__ = 'users'
__table_args__ = {'schema': 'public'}
id = db.Column(
db.Integer,
primary_key=True
)
...

我不太清楚为什么要从Basevsdb继承。模型-数据库。模型似乎会在公共场合自动创建表,我希望避免这种情况。

奖金问题

一旦创建了模式,如果接下来我需要向所有模式添加表,那么最好的管理方法是什么?烧瓶迁移本身能处理这个问题吗?

谢谢!

如果将来有人看到这一点,这个解决方案似乎可以广泛使用,但我最近遇到了一个问题。

这条线路

table.__table__.schema = user.name

似乎会产生一些奇怪的行为,其中user.name的值似乎会在应用程序的顺序区域中持续存在,因此如果切换user,则会错误地查询上一个用户的表。

我不完全确定为什么会发生这种情况,仍在研究如何修复它。

最新更新