TypeORM使用Postgres的unnest函数实现批量插入失败如何解决?
TypeORM 调用Postgres unnest批量插入的正确调整方案
原有代码无法正常执行的核心原因是:
- 未给unnest返回的结果列显式指定别名,TypeORM无法将返回字段与目标实体的插入列做映射
- 子查询的参数传递方式不符合QueryBuilder的绑定规则,导致参数未被正确识别
正确代码示例如下:
manager .createQueryBuilder() .insert() // 显式指定要插入的实体列,顺序和后续select的列顺序保持一致 .into(Foo, ['a', 'b', 'c']) .values((qb) => qb // 列别名可自定义,只要和后续unnest返回的列顺序、类型匹配即可 .select(['col1', 'col2', 'col3']) // 给unnest的结果集加表别名,用占位符声明参数 .from('UNNEST(:arr1::int[], :arr2::text[], :arr3::text[])', 'unnest_res') // 通过setParameter绑定数组参数 .setParameter('arr1', data1) .setParameter('arr2', data2) .setParameter('arr3', data3) ) .execute()
调整后生成的SQL符合预期:
INSERT INTO "foo"("a", "b", "c") SELECT "col1", "col2", "col3" FROM UNNEST($1::int[], $2::text[], $3::text[]) AS "unnest_res"
内容的提问来源于stack exchange,提问作者Leekie
相关产品推荐
相关产品推荐

