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表中的外键列名RoleNamesourceKey:Role表中被关联的字段name
修改后的Role模型关联代码:
static associate(models) { Role.hasMany(models.User, { foreignKey: "RoleName", sourceKey: "name" }); }
配置完成后,Sequelize就能正确识别关联字段,不会再去查询不存在的RoleId列了。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

