You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:25:53