如何将Typescript对象数组直接插入Postgres表无需遍历处理
解决方案
你的需求完全可以通过PostgreSQL原生的json_to_recordset函数实现,不需要对Typescript数组做任何遍历或修改,仅通过单条SQL语句即可完成全量数据插入。
具体实现逻辑
你只需要把整个shipments数组序列化为JSON字符串,作为查询参数传入原生SQL即可,PostgreSQL会自动完成JSON结构到表记录的转换,不需要在TS层做任何数据处理。
代码示例
SQL语句模板
INSERT INTO 你的表名 (id, name, age, orderNumber) SELECT * FROM json_to_recordset($1) AS t( id INT, name VARCHAR, age INT, orderNumber VARCHAR );
注意:
AS t后面括号里的列类型,要和你实际表结构的列类型保持完全一致,这也是多数人使用json_to_recordset报错的核心原因。
AdonisJS中调用示例
await Database.connection(tenant).raw( ` INSERT INTO ?? (id, name, age, orderNumber) SELECT * FROM json_to_recordset(?) AS t( id INT, name VARCHAR, age INT, orderNumber VARCHAR ) `, [table, JSON.stringify(shipments)] )
方案说明
- 整个过程不需要对shipments数组做任何遍历、重组操作,仅做一次JSON序列化即可,性能损耗可以忽略
- 单条SQL执行,没有Adonis multiInsert的1000条上限限制
- 字段映射关系可以灵活调整,如果你后续表字段有变化,只需要修改SQL里的列定义部分即可,不需要修改TS层的数组结构
常见问题排查
如果你之前使用json_to_recordset失败,90%以上的情况是如下两种原因:
AS t(...)里声明的列名、列类型和实际表结构不匹配,比如列名大小写不一致、数值类型和字符串类型混用- 传入的JSON字符串格式错误,确保你传入的是序列化后的标准JSON格式,没有TS特有的语法残留
内容的提问来源于stack exchange,提问作者Just Me
相关产品推荐
相关产品推荐

