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

如何用Mikro-ORM实现INSERT...SELECT式的批量行复制操作?

使用Mikro-ORM实现批量复制行(无需加载实体到内存)

你可以通过Mikro-ORM的QueryBuilder直接构造INSERT ... SELECT语句,完全对应你给出的原生SQL逻辑,无需将实体加载到应用内存中,适合大数据量场景。

方法一:QueryBuilder链式语法(贴近原生SQL)

假设你的实体类名为MyEntity,可以这样编写:

const qb = em.createQueryBuilder(MyEntity);

await qb
  .insert()
  .columns(['id', 'foreign_id', 'created_at'])
  .select(qb.raw('id, 42 as foreign_id, now() as created_at'))
  .from(MyEntity)
  .where({ foreign_id: 31 })
  .execute();

方法二:简化版链式写法

如果想简化代码结构,也可以在insert中指定静态字段,配合select选取源数据字段:

const qb = em.createQueryBuilder(MyEntity);

await qb
  .insert({ foreign_id: 42, created_at: qb.raw('now()') })
  .select(['id'])
  .where({ foreign_id: 31 })
  .execute();

方法三:直接执行原生SQL

若更习惯原生SQL写法,也可以通过EntityManager的execute方法直接运行:

await em.execute(`
  INSERT INTO my_table (id, foreign_id, created_at)
  SELECT id, 42, now()
  FROM my_table
  WHERE foreign_id = 31;
`);

注意事项

  • 若id是自增主键,直接复制源行的id会触发主键冲突,此时需要从INSERT和SELECT中移除id字段,让数据库自动生成新主键。
  • QueryBuilder方式具备类型安全特性,能更好地和实体类关联,推荐优先使用。

内容的提问来源于stack exchange,提问作者isqua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:15:02