TypeORM操作PlanetScale时,如何生成单条批量插入SQL?
问题
我正在使用TypeORM作为PlanetScale(MySQL)数据库的ORM,希望实现批量插入记录。我的代码如下:
const batch = [{name: 'a'},{name: 'b'},{name: 'c'},{name: 'd'},{name: 'e'}]; // generate IDs const insertData = nameRepository.create(batch); // bulk insert await nameRepository.save(insertData);
它生成的SQL如下(在一个事务中执行5条独立查询):
insert into name (id, name) values (1, 'a'); insert into name (id, name) values (2, 'b'); insert into name (id, name) values (3, 'c'); insert into name (id, name) values (4, 'd'); insert into name (id, name) values (5, 'e');
而我期望生成的SQL是这样的:
insert into name (id, name) values (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e');
原本这不会有问题,但我现在遇到了超时错误和事务失败(save操作在单个事务中执行),我猜测这是因为每个批量要插入数百条记录,给PlanetScale的免费版(最小实例)造成了过多插入请求。我无法修改PlanetScale的timeout值,它固定为20秒。基于此,我的问题是:如何强制TypeORM生成单条批量插入SQL?
解决方案
要让TypeORM生成单条批量插入SQL,替换save方法为insert方法即可,具体操作如下:
直接使用
insert方法插入预生成ID的数据
如果你已经提前生成好ID(如代码中逻辑),直接构造包含ID的插入数组,调用insert就能生成单条批量插入SQL:const batch = [ {id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}, {id: 4, name: 'd'}, {id: 5, name: 'e'} ]; await nameRepository.insert(batch);依赖数据库自动生成ID的场景
如果你的表主键是自增类型(MySQL自增ID),可以省略ID字段直接传入数据,insert方法同样会生成单条批量插入语句:const batch = [{name: 'a'},{name: 'b'},{name: 'c'},{name: 'd'},{name: 'e'}]; await nameRepository.insert(batch);注意事项
insert方法不会触发实体的beforeInsert/afterInsert钩子,若业务逻辑依赖这些钩子,需要手动处理对应逻辑。- 针对超大量数据(数千条级别),建议分批次插入(比如每500条一批),避免单条SQL过长引发性能问题。
内容的提问来源于stack exchange,提问作者Nishant
相关产品推荐
相关产品推荐

