使用TypeORM CLI与NestJS执行迁移时提示No migrations are pending问题
解决TypeORM 0.3.x + NestJS TypeORM 9.x迁移找不到文件的问题
针对你遇到的迁移创建成功但执行时提示No migrations are pending的问题,以下是几个针对性的排查和解决方法:
1. 确认迁移文件结构正确性
确保迁移文件正确实现MigrationInterface,且类名符合{迁移名称}{时间戳}的命名规则,示例:
import { MigrationInterface, QueryRunner } from "typeorm"; export class Chat1676252827402 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<void> { // 你的迁移逻辑 } public async down(queryRunner: QueryRunner): Promise<void> { // 回滚逻辑 } }
若类未正确实现接口或命名不符合规范,TypeORM会无法识别该文件为迁移文件。
2. 修正迁移路径解析逻辑
在postgres.config.ts中,改用基于项目根目录的绝对路径配置,避免__dirname在ts-node和编译后环境的解析差异:
import { resolve } from 'path'; // 替换原migrations配置 migrations: [resolve(process.cwd(), 'src/configs/database/migrations/**/*.{ts,js}')],
3. 调整CLI命令执行方式
方式一:使用编译后的JS文件执行迁移
先执行项目编译(如yarn build),再用编译后的DataSource配置文件运行迁移:
// package.json新增命令 "migration:run:prod": "typeorm migration:run -d dist/configs/database/dataSource.config.js"
执行命令:yarn migration:run:prod
方式二:优化ts-node CLI命令
确保ts-node能正确解析路径,调整CLI命令为:
"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js", "migration:run": "yarn typeorm migration:run -d src/configs/database/dataSource.config.ts"
添加.js后缀指向typeorm的CLI入口文件,避免环境解析问题。
4. 检查DataSource配置细节
- 确认
databaseConfig中的name为"default",保证CLI使用的数据源名称与数据库连接一致 - 若曾手动修改过迁移表名,需在配置中明确指定:
migrationsTableName: 'migrations', // 与数据库中实际表名保持一致
5. 验证迁移文件是否被加载
在dataSource.config.ts中添加日志,确认DataSource是否正确加载迁移文件:
import { DataSource } from "typeorm"; import { databaseConfig } from "./postgres.config"; export const AppDataSource = new DataSource(databaseConfig); // 打印加载的迁移文件列表 AppDataSource.initialize().then(() => { console.log('已加载的迁移文件:', AppDataSource.migrations); }).catch(err => { console.error('数据源初始化失败:', err); });
执行ts-node src/configs/database/dataSource.config.ts,若输出中没有目标迁移文件,说明路径配置仍有问题。
内容的提问来源于stack exchange,提问作者charlescol
相关产品推荐
相关产品推荐

