NestJS + TypeORM本地执行迁移提示“No migrations are pending”问题
解决TypeORM本地迁移提示“No migrations are pending”的问题
核心问题梳理
- 全新数据库生成迁移文件后,执行
migration:run提示无待执行迁移 - 更新package.json后出现该问题,此前功能正常
- 已将entities配置改为直接引入实体类(路径匹配时生成迁移提示无schema变更)
- 生产环境正常,本地环境失效,尝试过迁移文件夹移至dist、先构建再执行均无效
针对性解决方案
1. 修正迁移文件路径配置
当前配置migrations: ['/migrations/*.js']是系统绝对路径,会指向系统根目录而非项目根目录的migrations文件夹,需改为项目相对路径:
// 若db.datasource.ts在项目根目录,使用__dirname定位 migrations: [__dirname + '/migrations/*.ts'], // 或直接用项目相对路径(适配ts-node运行) migrations: ['./migrations/*.ts'],
注:因为你使用
typeorm-ts-node-commonjs直接运行TS文件,所以要匹配.ts后缀的迁移文件;若先构建再执行,则改为.js并指向dist目录下的migrations。
2. 检查数据库连接的一致性
从日志可见数据库名不一致:
query: SELECT * FROM
INFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMA= 'laps5' ANDTABLE_NAME= 'migrations'
query: SELECT * FROMtestdb.migrationsmigrationsORDER BYidDESC
这说明本地环境中process.env.DATABASE未正确加载,导致连接到错误数据库:
- 验证本地
.env文件中DATABASE字段的值是否为预期的库名 - 在datasource配置中添加日志打印确认:
console.log('当前连接数据库:', process.env.DATABASE); export const datasourceOptions: DataSourceOptions = { // ...其他配置 database: process.env.DATABASE, };
3. 确认迁移文件的有效性
TypeORM通过迁移文件名的timestamp判断是否已执行:
- 检查迁移文件命名是否符合格式:
{timestamp}-{迁移名称}.ts(如1700000000000-CreateUserTable.ts) - 打开迁移文件,确保
up方法包含实际的SQL操作,而非空实现
4. 调整迁移执行命令参数
直接在命令中指定迁移路径,避免配置解析问题:
npm run typeorm migration:run -- -d ./db.datasource.ts -m ./migrations/*.ts
5. 排查依赖版本冲突
更新package.json后出现问题,大概率是依赖版本不兼容:
- 对比生产环境与本地的
package-lock.json,确保TypeORM、mysql2、ts-node的版本一致 - 尝试回退TypeORM到之前的稳定版本(如从0.3.x最新版回退到0.3.17)
6. 手动检查migrations表状态
登录本地数据库,查看migrations表:
- 若表中已存在待执行迁移的timestamp记录,TypeORM会认为该迁移已完成,可手动删除对应行后重新执行
- 若表不存在,确认数据库连接正常后,TypeORM会自动创建该表
内容的提问来源于stack exchange,提问作者Massimiliano Oreto
相关产品推荐
相关产品推荐

