云计算百科
云计算领域专业知识百科平台

TypeORM Migrations---2

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » TypeORM Migrations---2
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!