如何在 Sequelize 模型中动态选择数据库(或“模式”)?

问题描述 投票:0回答:2

我正在使用 Nodejs、Seuqelize 和 Mysql 构建一个多租户应用程序。

我决定采用一种方法,每个租户都有一个单独的逻辑数据库(据我所知,在 Postgres 中这被称为“模式”,但在 Mysql 中它只是一个“数据库”)。我选择这种方法,因为在我的例子中,需要在 Node 进程启动之后创建数据库,并建立数据库连接,并且无法提前配置它们。 我不知道如何动态(在 HTTP 请求期间)告诉 Sequelize 模型,对于特定查询应该使用哪个数据库。

例如,假设我有这个 GET/照片/路线:

router.get('photo/', async function (req, res) { const tenantId = req.user.id//Assume the auth middleware provides a tenant id. try { const records = await Photo.findAll()//Need to tell the Photo model, which database/schema this //should be queried in res.json(records); } catch (error) { console.log(error) res.sendStatus(500) } })

当然,如果我使用原始查询,我只会说

SELECT * FROM ${tenantId}.photo


但是如果我使用 Sequelize,我想真正享受它的全部功能。

我如何知道照片模型使用哪个数据库?让我再次澄清一下,

我不是在谈论物理数据库

,而只是一个逻辑数据库。主机是同一台主机,并且我只有一个连接。 Sequelize 配置的初始“数据库”参数是一个保存所有租户的数据库,并引用其各自的数据库。

mysql node.js sequelize.js multi-tenant
2个回答
1
投票
Sequelize

实例。需要动态定义模型,以便在创建模型并随后返回时传入正确的

sequelize
实例。

getPhotoModelFor(tenantId) - 尝试获取特定租户的模型
  1. 可能应该检查缓存以查看它是否已经存在,是否需要处理过期等
  2. 如果模型不在该租户的缓存中,则获取该租户的
  3. sequelize
  4. 实例,如果不存在则创建
    使用此
  5. sequelize
  6. 实例和缓存定义模型
    返回模型并将其用于查询。

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.