You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sequelize查询不存在的RoleId列问题求助

问题

我有User和Role两张数据表,Role与User是hasMany关联。我在User模型里用RoleName作为外键列,关联Role表的name字段而非id,但执行任何查询都会报错:Sequelize始终会去查询RoleId列(我已经改成了RoleName),抛出SequelizeDatabaseError,错误码42703,提示column "RoleId" does not exist。删除数据表、重启数据库和系统都没用。

以下是我的模型代码:

User模型

"use strict";
const { Model } = require("sequelize");
const { password } = require("../config");
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    static associate(models) {
      // define association here
      User.belongsTo(models.Role, {
        foreignKey: "RoleName",
        targetKey: "name",
      });
      User.hasMany(models.Otp);
      User.belongsToMany(models.Permission, { through: "UserPermission" });
      User.belongsTo(models.Group, {foreignKey: "GroupId"});
    }
  }
  User.init(
    {
      first_name: DataTypes.STRING,
      last_name: DataTypes.STRING,
      email: { type: DataTypes.STRING, unique: true },
      password: DataTypes.STRING,
      phone_no: { type: DataTypes.STRING, unique: true },
      active: DataTypes.INTEGER,
      address: DataTypes.STRING,
      country: DataTypes.STRING,
      RoleName: {
        type: DataTypes.STRING,
        allowNull: false,
        references: {
          model: "Roles",
          key: "name",
        },
      },
      GroupId: {
        type: DataTypes.INTEGER,
        allowNull: false,
        references: {
          model: "Groups",
          key: "id",
        },
      },
    },
    {
      timestamps: true,
      paranoid: true,
      sequelize,
      modelName: "User",
    }
  );
  return User;
};

Role模型

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
      Role.hasMany(models.User);
    }
  }
  Role.init(
    {
      name: { type: DataTypes.STRING, unique: true, allowNull: false}
    },
    {
      timestamps: true,
      sequelize,
      modelName: "Role",
    }
  );
  return Role;
};
解决方法

问题出在双向关联配置不完整:你只在User.belongsTo里指定了自定义外键和目标键,但Role.hasMany端没有对应配置,Sequelize会默认使用RoleId作为外键生成查询语句。

需要修改Role模型的hasMany关联,明确指定两个关键参数:

  • foreignKey:User表中的外键列名RoleName
  • sourceKey:Role表中被关联的字段name

修改后的Role模型关联代码:

static associate(models) {
  Role.hasMany(models.User, {
    foreignKey: "RoleName",
    sourceKey: "name"
  });
}

配置完成后,Sequelize就能正确识别关联字段,不会再去查询不存在的RoleId列了。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:22:11