我正在使用SQLAlchemy开发多租户Web应用程序,我想在某些表上使用tenant_id列来隔离每个租户的数据。理想情况下,过滤并添加此tenant_id将是自动的。
我发现Flask的创建者在进行this演讲时,简短地提到了使用sqlalchemy进行此操作的方法。 This食谱(可从this堆栈溢出问题中找到)对这种方法进行了更详细的介绍,但同时也指出了一些缺陷。主要是它不会处理更新或删除查询。在我看来,这就像是一个重大缺陷,习惯于自动处理tenant_id的开发人员在执行更新或删除操作时可能会轻易忘记,从而造成漏洞。它建议通过使用before_cursor_execute()事件处理程序解决更新和删除问题。但是,据我所知,这种方法将涉及直接编辑SQL文本,这在很大程度上使用了SQLAlchemy。没什么大问题,但是插入也没有得到处理。
我还发现了this库,它试图解决该问题,但是它被描述为实验性的,并且已经有5年没有更新了。似乎也存在上述解决方案的问题。
在我看来,这是一种常见的模式,但令我惊讶的是,目前还没有针对SQLAlchemy的好的可靠解决方案。 This库支持Django的这种方法。
理想情况下,我希望拥有一个范围仅限于租户的会话,并在每次选择,更新,删除和插入时自动应用tenant_id,以便可以编写查询而无需考虑租户。这可行吗?
如果有人可以帮助或指出正确的方向,我将不胜感激。谢谢!