背景
最近在设计一个多租户的系统,由于每个租户需要在schema层面进行隔离,原来的项目又是使用sequelize作为ORM框架,搜索了网上和官方提供的方法,发现都是使用的多个schema,使用多个sequelize实例,这样做比较简单,但是如果库比较多会创建很多的sequelize实例,每个实例还需要单独的连接池,单独的去加载model
解决办法
抱着试一试的态度,撸了一下sequelize的源代码,发现sequelize的语句拼接都是一步一步进行的:
代码可见:sequelize/lib/dialects/abstract/query-generator.js
比如:selectQuery
// resolve table name options
if (options.tableAs) {
mainTable.as = this.quoteIdentifier(options.tableAs);
} else if (!Array.isArray(mainTable.name) && mainTable.model) {
mainTable.as = this.quoteIdentifier(mainTable.model.name);
}
mainTable.quotedName = !Array.isArray(mainTable.name) ? this.quoteTable(mainTable.name) : tableName.map(t => {
return Array.isArray(t) ? this.quoteTable(t[0], t[1]) : this.quoteTable(t, true);
})