如何用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
相关产品推荐
相关产品推荐

