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

如何在Sequelize bulkCreate中关联已存在的belongsTo模型?

问题:Sequelize批量创建用户时如何通过关联对象设置belongsTo关联?

我有两个模型:Role和User,它们的关联关系为Role has many Users、User belongs to Role。单独创建用户后调用setRole设置角色可以正常工作,但批量创建用户并关联特定角色对象时,要么不添加include参数导致外键列为空,要么添加include后Sequelize尝试插入新角色而非关联已存在的角色。

请问能否在bulkCreate的对象数组中通过关联模型对象来设置belongsTo关联,而非直接设置ID?


Role 模型代码

class Role extends Model {
    static associate(models) {
        this.hasMany(models.User);
    }
}

Role.init({
    name: DataTypes.STRING,
    level: DataTypes.SMALLINT.UNSIGNED,
    unrestricted: DataTypes.BOOLEAN,
    preferences: DataTypes.TEXT
}, {
    sequelize: getSequelizeInstance(),
    modelName: 'Role',
    timestamps: true
});

User 模型代码

class User extends Model {
    static associate(models) {
        this.belongsTo(models.Role);
    }
}

User.init({
    name: DataTypes.STRING,
    username: {
        type: DataTypes.STRING,
        unique: true
    },
    password: DataTypes.STRING,
    refreshToken: DataTypes.STRING
}, {
    sequelize: getSequelizeInstance(),
    modelName: 'User',
    timestamps: true,
    scopes: {
        withoutSecrets: {
            attributes: { exclude: ['password', 'refreshToken'] },
        }
    }
});

插入角色数据

await Role.bulkCreate([
    {
        name: 'Dev',
        level: 0,
        unrestricted: true
    },
    {
        name: 'Admin',
        level: 1,
        unrestricted: false
    },
    {
        name: 'User',
        level: 2,
        unrestricted: false
    },
]);

单个创建用户并关联角色(可行)

const roles = await Role.findAll();
const user = await User.create({
    name: 'Dev',
    username: 'dev',
    password: await hashPassword('123456')
});
await user.setRole(roles.find(role => role.dataValues.name === 'Dev'));

批量创建用户并关联角色(触发错误)

const roles = await Role.findAll();
await User.bulkCreate([
    {
        name: 'Dev',
        username: 'dev',
        password: await hashPassword('123456'),
        Role: roles.find(role => role.dataValues.name === 'Dev')
    },
    {
        name: 'Admin',
        username: 'admin',
        password: await hashPassword('123456'),
        Role: roles.find(role => role.dataValues.name === 'Admin')
    },
    {
        name: 'User',
        username: 'user',
        password: await hashPassword('123456'),
        Role: roles.find(role => role.dataValues.name === 'User')
    },
], {
    include: Role
});

执行的查询语句:

Executing (default): SELECT `id`, `name`, `level`, `unrestricted`, `preferences`, `createdAt`, `updatedAt` FROM `Roles` AS `Role`;      
Executing (default): INSERT INTO `Roles` (`id`,`name`,`level`,`unrestricted`,`preferences`,`createdAt`,`updatedAt`) VALUES (1,'Dev',0,true,NULL,'2023-03-27 19:01:22','2023-03-27 19:01:22'),(2,'Admin',1,false,NULL,'2023-03-27 19:01:22','2023-03-27 19:01:22'),(3,'User',2,false,NULL,'2023-03-27 19:01:22','2023-03-27 19:01:22');

错误信息:

ERROR: Validation error

使用版本:Node: 16.19.0, CLI: 6.6.0, ORM: 6.29.3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:14:53