TypeORM中如何实现类似原生SQL的INSERT FROM SELECT合并单语句操作
TypeORM实现单条INSERT ... SELECT语句的方案
TypeORM的InsertQueryBuilder本身内置了子查询插入的支持,不需要调用values()方法传参,直接通过链式调用.select()传入子查询构造逻辑即可,完全匹配原生SQL的INSERT INTO ... SELECT效果,实现代码如下:
await this.userSectionReadRepository .createQueryBuilder() .insert() .into(UserSectionRead) // 显式指定要插入的字段,顺序要和子查询返回的字段顺序对应 .columns(['userId', 'commentId']) .select((subQb) => { return subQb // 固定参数用占位符绑定 .select(':userId', 'userId') .addSelect('sectionComment.id', 'commentId') .from(Article, 'article') .innerJoin('article.sectionComments', 'sectionComment') .where( 'article.vaultId = :vaultId and article.valueId = :valueId and sectionComment.userId = :userId' ) .setParameters({ valueId, vaultId, userId }) }) .orIgnore() .execute()
实现说明
- 该方案是单次数据库请求,相比两次请求的原有实现,既提升了性能,也保证了操作的原子性,避免了两次请求中间数据变化引发的一致性问题
- 无需额外做返回结果判空处理:子查询无匹配数据时,数据库会自动跳过插入操作,和原有逻辑完全对齐
- 静态参数统一通过
setParameters传入,不会有SQL注入风险
内容的提问来源于stack exchange,提问作者kosmičák
相关产品推荐
相关产品推荐

