繁体   English   中英

如何在 Sequelize model 中动态 select 数据库(或“模式”)?

[英]How to dynamically select the database(or “schema”), in a Sequelize model?

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

我已经决定了一种方法,每个租户都有一个单独的逻辑数据库(据我了解,在 Postgres 中这将被称为“模式”,但在 Mysql 中它只是一个“数据库”)。 我之所以选择这种方法,是因为在我的情况下,需要Node 进程已经启动并建立数据库连接之后创建数据库,并且无法提前配置它们。

我不知道如何动态地(在 HTTP 请求期间)告诉 Sequelize model,应该使用哪个数据库,用于特定查询。

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

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,我想真正享受它的全部功能。

我如何知道照片 model 使用哪个数据库? 让我再次澄清一下,我不是在谈论物理数据库,而只是在谈论逻辑数据库。 主机是同一台主机,我只有一个连接 Sequelize 配置的初始“数据库”参数是一个包含所有租户的数据库,并引用了他们各自的数据库。

您需要为要为其创建连接的每个模式创建一个新的Sequelize实例。 模型需要动态定义,以便在创建 Model 并随后返回时传入正确的sequelize实例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM