如何使用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
相关产品推荐
相关产品推荐

