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

如何在TypeORM v.0.3.6中使用DataSource实现永久数据种子?是否有简便方案?

我最近刚在TypeORM 0.3.6版本里搞定了数据种子功能,确实之前的typeorm-seeding因为依赖旧的Connection对象没法直接用了,但其实咱们可以自己搭一套轻量的方案,完全适配DataSource,步骤也挺简单的:

适配TypeORM 0.3.6的轻量数据种子方案

1. 先搭好基础结构

在项目里新建一个src/seeds目录,专门用来放所有种子文件——比如命名成CreateAdminUser.seed.ts这种格式,一眼就能看出来是干嘛的。

2. 写个种子基类省重复代码

咱们可以封装一个基类,把DataSource的初始化逻辑统一处理,这样每个具体的种子都不用重复写这部分:

// src/seeds/BaseSeed.ts
import { DataSource } from "typeorm";

export abstract class BaseSeed {
  protected dataSource: DataSource;

  constructor(dataSource: DataSource) {
    this.dataSource = dataSource;
  }

  abstract run(): Promise<void>;
}

3. 编写具体的种子文件

比如咱们要创建一个默认管理员用户,就写这样的种子:

// src/seeds/CreateAdminUser.seed.ts
import { BaseSeed } from "./BaseSeed";
import { User } from "../entities/User"; // 替换成你自己的用户实体类
import bcrypt from "bcrypt"; // 记得提前安装bcrypt哦

export class CreateAdminUserSeed extends BaseSeed {
  async run(): Promise<void> {
    const userRepository = this.dataSource.getRepository(User);
    
    // *一定要加这个判断!*避免重复执行脚本时创建重复数据
    const existingAdmin = await userRepository.findOneBy({ email: "admin@example.com" });
    if (existingAdmin) {
      console.log("管理员用户已存在,跳过...");
      return;
    }

    const adminUser = userRepository.create({
      email: "admin@example.com",
      password: await bcrypt.hash("admin123", 10),
      role: "admin"
    });

    await userRepository.save(adminUser);
    console.log("管理员用户创建成功!");
  }
}

4. 写个执行脚本跑所有种子

创建src/seeds/run-seeds.ts,用来初始化DataSource并批量执行所有种子:

// src/seeds/run-seeds.ts
import { DataSource } from "typeorm";
import { AppDataSource } from "../data-source"; // 替换成你项目里的DataSource配置文件
import { CreateAdminUserSeed } from "./CreateAdminUser.seed";
// 后面加了新种子,就在这里导入进来

async function runSeeds() {
  let dataSource: DataSource;
  try {
    // 初始化数据源
    dataSource = await AppDataSource.initialize();
    console.log("数据源初始化完成,开始执行种子...");

    // 按顺序执行种子,调整数组顺序就能控制执行优先级
    const seeds = [
      new CreateAdminUserSeed(dataSource),
      // 把其他种子实例加到这里
    ];

    for (const seed of seeds) {
      await seed.run();
    }

    console.log("所有种子执行完成!");
  } catch (error) {
    console.error("执行种子时出错:", error);
    process.exit(1);
  } finally {
    // 执行完记得销毁数据源连接
    if (dataSource) {
      await dataSource.destroy();
    }
  }
}

runSeeds();

5. 加个npm脚本方便运行

在package.json的scripts里加一行:

"scripts": {
  // ...你的其他脚本
  "seed": "ts-node src/seeds/run-seeds.ts"
}

之后只要运行npm run seed就能执行所有种子了!

小提示

  • 新增种子只需要继承BaseSeed实现run方法,再加到run-seeds.ts的数组里就行
  • 种子里的存在性检查很重要,不然重复执行会生成重复数据
  • 如果有依赖顺序的种子(比如先创建角色再创建用户),调整seeds数组的顺序就能保证执行顺序

内容的提问来源于stack exchange,提问作者Léalbatroz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:07:47