如何根据请求以编程方式切换DB来支持多租户系统?

时间:2014-02-26 16:56:25

标签: sails.js

此问题已从GitHub问题中移植出来:

在运行时,我想指定一个HTTP请求通过身份验证后使用的数据库连接(通过策略)。实现这一目标的最佳方法是什么?

例如,接收具有标题“tenant_id:smith”的GET请求以便列出所有用户(例如/用户)。我现在希望切换到“smith”Mongo DB来查询并返回该租户的相关数据。

来自particlebanana的回复:

现在不支持开箱即用。一个“连接”附加到一个集合,并发送到适配器注册自己,在您的情况下sails-mongo。

主要围绕postgresql适配器进行了一些讨论,以允许在查询中动态选择模式。这将在查询条件对象上附加一些可由适配器解析的可选参数。这不是我们已经开始的事情。一旦v0.10最终发布并且没有测试版,我们就可以通过这个并获得一个很好的解决方案。

现在,我能想到的唯一解决方案是一个自定义适配器,它包装sails-mongo适配器以动态选择要使用的数据库。

2 个答案:

答案 0 :(得分:2)

警告:这是一种潜在的危险方法 - 相反,我们为每个租户创建一组模型:https://github.com/balderdashy/sails-mongo/issues/130

我取得了一些进展,现在似乎通​​过这种方法实现了一个实现:

  • 我分叉了sails-mongo适配器来创建一个sails-mongo-multi适配器,我将其设置为所有相关模型的默认值(即需要多租户的模块)。

  • 在adapter.js内,在registerConnection函数中,我为每个租户加载所有数据库配置,并为每个租户创建一个新的连接(传入该租户的配置)。这在启动时发生,所以现在我希望在添加新租户时重新启动Sails。

  • 我创建了一个switchDB函数,它接受一个租户ID,并将迭代每个Collection对象并更新其中包含的连接。

  • 我还更新了顶级连接对象(在调用本机查询时使用)。

如果发现任何易碎或破损的话,我会在此处发布更新。

答案 1 :(得分:0)

我已向[{3}}提交了一个拉请求来解决此问题。 见Waterline

我希望这会有所帮助,很快就会合并!我很乐意听到社区的任何反馈。