mysql - 如何在 Sequelize 模型中动态选择数据库(或 "schema")?

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

我正在构建一个 Multi-Tenancy 应用程序,使用 Nodejs、Seuqelize 和 Mysql。
我决定采用一种方法,让每个租户获得一个单独的逻辑数据库(据我所知,在 Postgres 中,这将被称为“模式”,但在 Mysql 中,它只是一个“数据库”)。我选择这种方式,因为在我的情况下,需要在 Node进程已经启动之后创建数据库,并且建立了一个DB连接,并且没有办法提前配置它们。
我不知道如何动态地(在 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,我想真正享受它的全部功能。
我如何告诉 Photo 模型,使用哪个数据库?让我再次澄清一下, 我不是在谈论物理数据库 ,而只是一个逻辑数据库。主机是同一台主机 ,我只有一个连接 。 Sequelize 配置的初始“数据库”参数是一个包含所有租户的数据库,并引用了它们各自的数据库。

最佳答案

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

  • getPhotoModelFor(tenantId) - 尝试获取特定租户的模型
  • 可能应该检查缓存以查看它是否已经存在,需要处理过期等
  • 如果模型不在此租户的缓存中,则获取此租户的 sequelize 实例,如果不存在则创建
  • 使用此 sequelize 实例定义模型并缓存
  • 返回模型并将其用于查询。
  • 关于mysql - 如何在 Sequelize 模型中动态选择数据库(或 "schema")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65852197/

    相关文章:

    mysql - Left Join 2 tables on 1 table

    linux - Unix 中 mysql 的自动备份脚本

    javascript - 干燥 NodeJS 下 TypeScript 中的常见情况 require

    javascript - 如何连接 Bookshelf.js 中的三个表?

    javascript - Sequelize - hasMany() - setter 将前一行的外键重置为 null

    php - 当列格式为varchar时如何查询顺序为asc(或desc)

    php - 使用 PHP 访问另一个对象内的数组内的对象

    javascript - 从 Google 电子表格中获取两个日期之间的数据

    node.js - sequelize.js - 添加一列作为复合主键

    node.js - Sequelize - 在关联表上选择