TypeORM 启动服务时自动向Roles表插入预设角色的实现方法
TypeORM 表创建后自动插入预设角色的解决方案
共有两种无需手动修改迁移文件的实现方案,可根据项目复杂度选择:
方案一:使用官方数据填充(Seeder)能力(推荐中大型项目使用)
这是TypeORM生态官方主推的预设数据写入方案,和迁移逻辑完全解耦,支持按环境控制执行逻辑,易维护。
- 安装依赖:
npm install typeorm-extension --save-dev - 新建角色填充文件
src/database/seeds/role.seeder.ts,示例代码如下:
import { Seeder, SeederFactoryManager } from 'typeorm-extension'; import { DataSource } from 'typeorm'; import { Role } from '../../entities/role.entity'; export default class RoleSeeder implements Seeder { async run(dataSource: DataSource, factoryManager: SeederFactoryManager) { const roleRepository = dataSource.getRepository(Role); // 存在数据则跳过,避免重复插入 const hasInit = await roleRepository.exists({ where: {} }); if (hasInit) return; await roleRepository.insert([ { name: 'Admin', description: '超级管理员' }, { name: 'User', description: '普通用户' } ]); } }
- 配置自动执行逻辑:可以在启动命令中加入seeder执行指令,示例package.json脚本配置:
{ "scripts": { "start:prod": "typeorm migration:run && typeorm-extension seed:run && node dist/main.js" } }
也可以在代码中DataSource初始化完成后主动调用runSeeder方法触发填充。
方案二:监听DataSource初始化事件(推荐小型项目使用)
不需要引入额外依赖,直接在TypeORM初始化逻辑中嵌入预设数据插入逻辑即可。
示例代码:
import { DataSource } from 'typeorm'; import { Role } from './entities/role.entity'; export const AppDataSource = new DataSource({ // 此处填写你的TypeORM连接配置 }); AppDataSource.initialize() .then(async () => { const roleRepository = AppDataSource.getRepository(Role); const roleCount = await roleRepository.count(); // 无数据时才执行插入 if (roleCount === 0) { await roleRepository.save([ { name: 'Admin' }, { name: 'User' } ]); } console.log('TypeORM 初始化完成'); }) .catch((err) => console.log('TypeORM 初始化失败', err));
注意:两种方案都建议加入数据存在性判断逻辑,避免服务重启时重复插入相同数据,生产环境建议单独配置填充逻辑的执行开关,避免误修改业务数据。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

