Sequelize无法创建关联:查询提示session未关联user
问题描述
使用Sequelize v6.35.1为User和Session模型建立关联后,执行包含关联查询时触发错误:"session is not associated to user!"
User模型代码
const { DataTypes } = require('sequelize'); import db from '../db'; const UserModel = db.define('user', { id: { type: DataTypes.STRING, unique: true, primaryKey: true, allowNull: false }, email: { type: DataTypes.STRING, allowNull: true, unique: true }, ... }); export default UserModel;
Session模型代码
const { DataTypes } = require('sequelize'); import db from '../db'; const SessionModel = db.define('session', { id: { type: DataTypes.STRING, unique: true, allowNull: false, primaryKey: true }, userId: { type: DataTypes.STRING, allowNull: false, references: { model: 'users', key: 'id' } }, expiresAt: { type: DataTypes.DATE, allowNull: false } }); export default SessionModel;
关联定义脚本
require('dotenv').config({ path: '../.env' }); const { DataTypes } = require('sequelize'); import db from '../db'; // Models import SessionModel from '../models/session'; import UserModel from '../models/user'; /** * Associations. */ // Session - User association UserModel.hasMany(SessionModel, { foreignKey: 'userId', type: DataTypes.STRING }); SessionModel.belongsTo(UserModel, { foreignKey: 'userId', type: DataTypes.STRING }); /** * Sync the database. */ const start = async () => { await db.sync({ force: true }); }; if (process.env.START && require.main === module) { start() .then(() => { console.info('DONE ✨'); }) .catch((err) => { console.error('ERROR 💥', err); }); }
查询代码
执行以下查询时触发报错:
const users = await UserModel.findAll({ where: whereCondition, include: [SessionModel] });
解决方法
确保关联逻辑在查询前全局执行
目前关联定义仅在迁移脚本运行时执行,实际业务查询时如果未重新初始化关联,模型间的关联关系不会被Sequelize注册。建议将关联逻辑抽离到单独的模型入口文件(如models/index.js),在应用启动时就加载执行:// models/index.js import db from '../db'; import UserModel from './user'; import SessionModel from './session'; // 定义关联 UserModel.hasMany(SessionModel, { foreignKey: 'userId' }); SessionModel.belongsTo(UserModel, { foreignKey: 'userId' }); export { UserModel, SessionModel, db };后续所有查询都从该入口文件导入模型,确保关联已初始化。
移除关联配置中的冗余参数
hasMany和belongsTo配置里的type: DataTypes.STRING属于冗余参数,外键类型已在模型定义中声明,仅保留foreignKey即可,多余参数可能导致Sequelize解析异常。验证模型实例一致性
确保查询时导入的模型实例,和定义关联时使用的是同一个对象,避免因重复导入导致的实例不匹配问题。确认sync执行顺序
虽然当前脚本中是先定义关联再执行db.sync,但需确保在所有业务代码运行前,关联已完成定义并执行过sync,保证表结构包含正确的外键约束。
内容的提问来源于stack exchange,提问作者Alin
相关产品推荐
相关产品推荐

