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

如何使用Sequelize+Node.js为多对多关联中间表roles_permissions填充种子数据

实现方案

调整种子文件执行顺序

Sequelize 默认按照种子文件前缀的时间戳排序执行种子,你需要先保证roles、permissions表的种子先执行完成,再执行中间表的种子,所以给三个种子文件加上递增的时间戳前缀即可,示例命名如下:

  • 20240101000000-roles.js(原roles表种子文件)
  • 20240101000001-permissions.js(原permissions表种子文件)
  • 20240101000002-roles-permissions.js(新建的中间表种子文件)

编写中间表种子文件代码

直接创建上述的20240101000002-roles-permissions.js文件,写入以下代码:

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    // 查询SUPER_ROLE的主键ID
    const superRole = await queryInterface.select(null, 'roles', {
      where: { name: 'SUPER_ROLE' },
      limit: 1
    });
    const superRoleId = superRole[0].id;

    // 查询所有已插入的权限的主键ID
    const allPermissions = await queryInterface.select(null, 'permissions', {
      attributes: ['id']
    });

    // 拼接中间表需要插入的关联数据
    const rolePermissions = allPermissions.map(permission => ({
      role_id: superRoleId,
      permission_id: permission.id,
      created_at: new Date(),
      updated_at: new Date()
    }));

    // 批量插入中间表
    await queryInterface.bulkInsert('roles_permissions', rolePermissions, {});
  },

  down: async (queryInterface, Sequelize) => {
    // 回滚时清空中间表数据,也可自定义条件只删除SUPER_ROLE的关联数据
    return queryInterface.bulkDelete('roles_permissions', null, {});
  }
};

执行种子命令

完成上述配置后,执行npx sequelize-cli db:seed:all即可完成所有种子数据的插入,包含SUPER_ROLE和所有初始权限的关联关系。

注意事项

  • 如果你自定义了表名、字段名,需要对应修改代码中的查询条件和插入字段
  • 如果需要更安全的回滚逻辑,可以在down方法中添加删除条件,只删除SUPER_ROLE对应的关联数据,避免误删其他已存在的关联数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:09:01