使用 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 MongoDB 无法使用 find 或 FindOne 搜索存储库