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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:45:08