使用 NestJS 和 TypeORM 为项目生成迁移文件

Posted

技术标签:

【中文标题】使用 NestJS 和 TypeORM 为项目生成迁移文件【英文标题】:Generating migration file for a project using NestJS and TypeORM 【发布时间】:2020-12-30 02:01:21 【问题描述】:

我正在尝试为我的实体生成迁移文件,但是每当我运行创建实体的命令时,它都会创建一个“空”文件,只创建 up 和 down 方法。

我在我的 package.json 文件中添加了这个脚本:"typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js"

在我的 app.module.ts 中,连接配置如下:

 TypeOrmModule.forRoot(
      type: 'mysql',
      host: database().host,
      port: parseInt(database().port),
      username: database().username,
      password: database().password,
      database: database().schema,
      entities: [Question, QuestionOption],
      migrations: ['src/migration/*.ts,.js'],
      cli: 
        migrationsDir: 'src/migration'
      ,
      synchronize: true,
    )

database() 是一个 Nestjs 配置文件,并从 .env 文件中获取值。

我用来创建迁移的脚本是:npm run typeorm migration:create -- -n QuestionTables -d src/migrations这里需要指定-d,否则不会创建迁移文件(即使是在forRoot 方法。

是否需要手动编写 SQL 来创建表?

如果我需要向现有表添加新列,我应该创建一个新的迁移文件并手动编写 SQL 代码来添加它吗?

我尝试运行的另一个命令是:npm run typeorm migration:generate -- -n QuestionTables -d src/migrations,它给了我一个错误:“错误:在任何 orm 配置文件中找不到连接选项。”

【问题讨论】:

【参考方案1】:

npm run typeorm migration:create 命令会生成空的迁移文件。

迁移自动生成的命令是:npm run typeorm migration:generate

如您收到的错误中所述,您需要指定 cli 的配置文件。这意味着应该将传递给forRoot 的配置提取到 ts/json 文件中。为此,您需要 2 个文件,1 个用于服务器连接,另一个用于迁移配置。

例如:

// ormconfig.ts
export const config: TypeOrmModuleOptions = 
      type: 'mysql',
      host: database().host,
      port: parseInt(database().port),
      username: database().username,
      password: database().password,
      database: database().schema,
      entities: [Question, QuestionOption], // maybe you should also consider chage it to something like:  [__dirname + '/**/*.entity.ts', __dirname + '/src/**/*.entity.js']
      migrations: ['src/migration/*.ts,.js'],
      cli: 
        migrationsDir: 'src/migration'
      ,
      synchronize: true,
    

// ormconfig-migrations.ts

import config from './ormconfig';

export = config;

import config from './ormconfig';

TypeOrmModule.forRoot(config);
// package.json

"scripts": 
     ...
     "typeorm:cli": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -f ./ormconfig-migrations.ts",
     "migration-generate": "npm run typeorm:cli -- migration:generate -n"

【讨论】:

好的,所以现在如果我运行命令 npm run migration-generate Test,它会说没有发现数据库模式的更改 - 无法生成迁移。我是否需要创建迁移并在其中手动编写 SQL 代码来创建表? 您是否已经创建了任何表?如果是这样,请清除架构,删除表或删除架构并重新创建它,然后运行迁移生成。此错误表示您的数据库已经有与项目中的实体匹配的表。 还没有,我的数据库是空的。 迁移表中有迁移吗? 我从数据库中删除了所有内容,那里只有一个没有任何表的数据库。如果我运行 npm run migration-generate,我会收到一条消息,说没有发现数据库模式的更改。如果我运行迁移创建,它会在迁移文件夹中创建一个文件,但 up 和 down 方法为空。它应该使用一些 SQL 代码创建迁移文件还是我需要编写该 SQL 代码?

以上是关于使用 NestJS 和 TypeORM 为项目生成迁移文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用返回多个项目的 TypeORM 设置 Nestjs 查询?

nestjs使用Typeorm实现数据库CRUD操作

如何在带有typeorm的nestjs项目中使用外部实体?

NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库

使用 NestJS、TypeORM、GraphQL 更新具有实体之间关系的 PSQL 表

NestJS TypeORM mongodb 在数组列中查找不起作用