Sequelize是否可以在同一查询中包含来自另一个数据库的表?

时间:2019-05-05 23:48:27

标签: mysql node.js sequelize.js

我有两个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`

0 个答案:

没有答案