【问题标题】:How to dynamically select the database(or "schema"), in a Sequelize model?如何在 Sequelize 模型中动态选择数据库(或“模式”)?
【发布时间】:2021-04-27 08:03:33
【问题描述】:

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

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

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

例如,假设我有这个 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,我想真正享受它的全部功能。

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

【问题讨论】:

    标签: mysql node.js sequelize.js multi-tenant


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多