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

