首次使用TypeORM生成迁移时遇到跨分片查询异常错误
NestJS + TypeORM 执行 migration:generate 生成迁移文件时出现跨分片查询错误
我使用NestJS搭配TypeORM,首次尝试执行migration:generate命令生成约30张表的迁移文件时触发异常。开启synchronize标志时表能够正常创建,说明实体声明无误。
错误信息
Error during migration generation: QueryFailedError: unsupported: '*' expression in cross-shard query at Query.onResult (.../node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:158:37) at Query.execute (.../node_modules/mysql2/lib/commands/command.js:36:14) at PoolConnection.handlePacket (.../node_modules/mysql2/lib/connection.js:456:32) at PacketParser.onPacket (.../node_modules/mysql2/lib/connection.js:85:12) at PacketParser.executeStart (.../node_modules/mysql2/lib/packet_parser.js:75:16) at Socket.<anonymous> (.../node_modules/mysql2/lib/connection.js:92:25) at Socket.emit (events.js:376:20) at addChunk (internal/streams/readable.js:309:12) at readableAddChunk (internal/streams/readable.js:284:9) at Socket.Readable.push (internal/streams/readable.js:223:10) { query: 'SELECT * FROM (\n' + ' SELECT\n' + ' *\n' + ' FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu`\n' + ' WHERE\n' + " `kcu`.`TABLE_SCHEMA` = 'goodturtle-db'\n" + ' AND\n' + " `kcu`.`TABLE_NAME` = 'AcademicStatus'\n" + ' UNION \n' + ' SELECT\n' + ' *\n' + ' FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` `kcu (about 2 thousand lines more...)
使用的TypeORM版本
"@nestjs/typeorm": "^9.0.1", "typeorm": "^0.3.11"
解决方法
1. 升级TypeORM版本
这个错误是TypeORM 0.3.11及更早版本的已知问题:处理大量表的迁移生成时,查询INFORMATION_SCHEMA使用SELECT *触发了分片数据库的查询限制。官方在0.3.12版本中修复了该问题,将通配符查询替换为具体字段查询。执行以下命令升级:
npm install typeorm@^0.3.12 @nestjs/typeorm@latest
2. 分批次生成迁移文件
如果暂时无法升级,可以拆分迁移生成任务,通过--tables参数指定部分表,分多次执行:
# 第一批次生成部分表的迁移 typeorm migration:generate -d src/data-source.ts src/migrations/Batch1 --tables AcademicStatus,Table2,Table3 # 第二批次生成剩余表的迁移 typeorm migration:generate -d src/data-source.ts src/migrations/Batch2 --tables Table4,Table5,...
注意合并迁移文件时要保证表的依赖顺序(如外键关联的表先创建)。
3. 适配分片数据库规则
如果你的MySQL采用了分片架构(如ShardingSphere),需要确认INFORMATION_SCHEMA的查询是否允许跨分片。可以联系DBA调整分片策略,或者确保迁移生成时的查询限定在单一分片内。
4. 反向生成初始迁移
利用synchronize先创建表,再反向生成迁移:
- 临时设置
synchronize: true在TypeORM配置中,启动项目让所有表创建完成。 - 执行
migration:generate生成初始迁移文件:typeorm migration:generate -d src/data-source.ts src/migrations/InitialSchema - 立即将
synchronize设置为false,避免生产环境自动修改表结构的风险。
内容的提问来源于stack exchange,提问作者Andrew Lee
相关产品推荐
相关产品推荐

