我有两个MySQL模式,都带有一个名为User的表,因为我想拥有一个具有多个微服务的SSO应用程序。我似乎无法让Sequelize生成满足我需要的正确SQL。
我尝试在Sequelize中将“ schema”属性添加到我的模型定义中,但是它尝试使用“ schema_name.schema_name.table_name”而不是“ schema_name.table_name”。我不确定schema属性是否适用于MySQL。
SuperUser.js
'use strict';
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(
'User',
{
id: {
primaryKey: true,
type: DataTypes.UUID,
allowNull: false,
},
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING,
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
company: DataTypes.STRING,
},
{
// tried to add schema: super_schema
underscored: true,
timestamps: true,
paranoid: true,
},
);
User.associate = function(models) {};
return User;
};
SubUser.js
'use strict';
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(
'User',
{
id: {
primaryKey: true,
type: DataTypes.UUID,
allowNull: false,
},
role: {
type: VARCHAR(45),
allowNull: false,
},
},
{
underscored: true,
timestamps: true,
paranoid: true,
},
);
User.associate = function(models) {
const { super } = models;
User.belongsTo(super.models.User, { as: 'Super', foreignKey: 'id' });
};
return User;
};
我的查询是
const user = await db.sub.User.findOne({
include: [
{
model: db.super.User,
as: 'Super',
where: {
username: 'someUsername',
},
},
],
});
我认为问题出在我如何创建Sequelize实例,如何为每个架构连接创建实例。因此,Sequelize并不知道db.super.User
与用Javascript编写的db.sub.User
不同。
问题在于它生成的INNER JOIN。
它生成
INNER JOIN `users` AS `Super` ON `User`.`id` = `Super`.`id`
我希望它生成
INNER JOIN `Super`.`users` AS `Super` ON `User`.`id` = `Super`.`id`