TypeORM Migrations—1(数据库的 Git)-CSDN博客
在上篇中对于数据迁移是通过sql脚本去实现的,接下来就是继续对其进行完善了,使得整一个migration可以通过cli去完成,并且可以控制从哪一个ID开始和哪一个ID结束。
正片内容:
对于可以通过cli去执行相应的逻辑就需要用到下面这些了
@Command({
name: 'migrate-bookmarks',
description: 'Migrate bookmarks from V1 to V2 format',
})
@Injectable()
export default class MigrateBookmarksCommand extends CommandRunner {
public constructor(
@InjectRepository(Bookmark)
private oldBookmarkRepo: Repository<Bookmark>,
@InjectRepository(BookmarkV2)
private newBookmarkRepo: Repository<BookmarkV2>,
) {
super();
}
public async run(
passedParams: string[],
options?: Record<string, any>,
): Promise<void> {}
@Option({
flags: '-s, –startAccountId <number>',
description: 'The starting account ID for migration',
})
parseStartAccountId(val: string): number {
const parsed = parseInt(val, 10);
if (isNaN(parsed) || parsed < 0) {
throw new Error('startAccountId must be a non-negative integer');
}
return parsed;
}
@Option({
flags: '-e, –endAccountId <number>',
description: 'The ending account ID for migration',
})
parseEndAccountId(val: string): number {
const parsed = parseInt(val, 10);
if (isNaN(parsed) || parsed < 0) {
throw new Error('endAccountId must be a non-negative integer');
}
return parsed;
}
用nest-commander来实现
nest-commander 是一个 基于 NestJS 设计理念的独立命令行工具库,它模仿了 NestJS 的装饰器和依赖注入风格,专门用于构建功能丰富的 Node.js 命令行应用(CLI apps)。
CommandRunner
- 和 @nestjs/core 类似,是一个抽象类。
- 你需要创建一个类继承 CommandRunner,并实现 run() 方法。
- 当某个命令被调用时,NestJS 风格的依赖注入容器会实例化这个类,并执行 run()。
run里面要写相应的逻辑处理。
@Command(…)
- 装饰器,用于定义一个 CLI 命令。
- 可以设置命令名、描述、参数格式等。
@Option
- 装饰器,用于定义命令支持的 选项(flags / options)。
- 支持短选项(-v)、长选项(–verbose)、带参数的选项(–env=prod)等。
使用方式
搞完这些,代码部分就ok了,那要怎么才能使用这个呢
这些搞完后,在cli中敲下yarn run build. node dist/bin/cli.js migrate-bookmarks -s 2001 -e 2002 就能跑了,-s -e分别对应上面代码中的@Option,表示从哪里开始哪里结束(这些都得在run方法里去自己实现的,用个for循环就OK的)至于为什么要用cli.js呢,注意不是使用整一个的入口而是需要重新定义一个入口文件,并且这是关于cli的入口文件
import 'reflect-metadata';
import { CommandFactory } from 'nest-commander';
import CmdModule from '../modules/CmdModule';
(async () => {
await CommandFactory.run(CmdModule, ['warn', 'error']);
})();
import 'reflect-metadata';
- 作用:启用 TypeScript 的 装饰器元数据支持。
- 为什么需要?
-
- NestJS(包括 nest-commander)大量使用装饰器(如 @Command(), @Injectable())。
- 这些装饰器需要在运行时知道“这个类注入了什么依赖”。
- reflect-metadata 是一个 polyfill,让 JavaScript 支持通过 Reflect 获取类、方法、参数的类型信息。
import { CommandFactory } from 'nest-commander';
- 作用:导入 nest-commander 库的核心类 CommandFactory。
- CommandFactory 是什么?
- 它是 nest-commander 提供的工具,用来:
- 扫描模块(Module)中带有 @Command() 装饰的类
- 启动并运行对应的命令
- 解析命令行参数
- 相当于 CLI 版的 NestFactory.create()(用于 HTTP 服务)。
import CmdModule from '../modules/CmdModule';
- 作用:导入你定义的 NestJS 模块 CmdModule。
- CmdModule 是什么?
-
- 一个用 @Module() 装饰的类
- 它“包含”了所有命令(如 MigrateBookmarksCommand)
- CommandFactory 会从这个模块开始扫描所有命令
总结
这一个运行步骤如下所示了:
启动 CLI ↓
加载 reflect-metadata(启用装饰器) ↓
导入 CmdModule(包含所有命令) ↓
CommandFactory.run() ↓
扫描 CmdModule 中所有 @Command() 类 ↓
解析命令行输入(如 node cli.js migrate-bookmarks) ↓
运行对应的 CommandRunner
评论前必须登录!
注册