TypeORM已生成迁移文件但执行失败,提示无待处理迁移
已通过npm run m:gen -- src/migrations/test1成功生成.ts迁移文件,但执行npm run m:run时终端输出如下内容,无法执行迁移:
query: SELECT VERSION() AS `version` query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'levels' AND `TABLE_NAME` = 'migrations' query: SELECT * FROM `levels`.`migrations` `migrations` ORDER BY `id` DESC No migrations are pending
当前相关配置
AppDataSource配置(/src/config/mysql.ts)
const AppDataSource = new DataSource({ type: "mysql", host: <string>process.env.HOST_DB, port: 3306, username: <string>process.env.USER_DB, password: <string>process.env.PASSWORD_DB, database: <string>process.env.DB, synchronize: false, logging: true, entities: [User, Album, Genre, Playlist], migrations: [__dirname + "/migrations/*{.ts,.js}"], migrationsRun: true, }); export { AppDataSource };
package.json脚本配置
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "nodemon src/app.ts", "typeorm": "typeorm-ts-node-esm -d ./src/config/mysql.ts", "m:gen": "npm run typeorm migration:generate", "m:run": "npm run typeorm migration:run" },
排查与解决步骤
修正迁移文件路径匹配
你的DataSource中migrations路径用__dirname + "/migrations/*{.ts,.js}",而__dirname指向/src/config/,实际会去/src/config/migrations/找文件,但你生成的迁移在/src/migrations/,路径不匹配导致TypeORM找不到文件。
解决:把migrations路径改为__dirname + "/../migrations/*{.ts,.js}",确保指向正确的目录。检查migrations表记录
查看数据库的migrations表,如果生成的迁移文件名已经存在于name字段中,TypeORM会判定该迁移已执行。
解决:确认该迁移未执行过的前提下,手动删除对应记录,再重新执行npm run m:run。规范迁移文件名格式
TypeORM默认识别带时间戳的文件名(如1699999999999-test1.ts),如果你的文件直接叫test1.ts,可能无法被识别。
解决:重新生成迁移时不指定自定义文件名,让TypeORM自动生成带时间戳的文件,或者确保文件名符合规则。处理ESM模块路径解析问题
使用typeorm-ts-node-esm时,ESM模块的路径解析和CommonJS不同,__dirname需要手动导入,可直接改用相对路径简化配置。
解决:将migrations路径改为"../migrations/*{.ts,.js}",或在tsconfig.json中配置baseUrl和paths优化路径解析。关闭自动迁移配置
DataSource中设置了migrationsRun: true,会在数据源初始化时自动执行未完成的迁移。如果应用已经启动过,可能迁移已经自动执行,手动运行时就会提示无待执行项。
解决:暂时将migrationsRun改为false,再执行npm run m:run,或查看应用启动日志确认是否已自动执行迁移。
内容的提问来源于stack exchange,提问作者Junior_R

