Go语言如何将嵌套Slice类型数据通过GORM写入Postgres数据库
解决方案
不需要额外定义OrdersStructDB类型,订单表的存储维度是单条订单,外层的pagination是接口返回的分页元数据,不需要写入订单库。你之前报错的核心原因是:formattedBody.Orders是切片类型,不能直接访问单个订单结构体的字段,必须遍历切片拿到每一个订单元素,再转换成你已经定义好的OrderStructDB结构,最后使用GORM的批量写入能力入库即可。
修改后的getOrders函数中写入数据库的代码如下:
// Connect DB db := helpers.ConnectDB() defer db.Close() // 建议把defer提前到获取DB连接后,避免中途报错漏掉资源释放 // 构造批量插入的OrderStructDB切片 var orderDBList []OrderStructDB for _, orderItem := range formattedBody.Orders { orderDB := OrderStructDB{ OrderID: orderItem.OrderID, InputStruct: orderItem.Input, OutputStruct: orderItem.Output, PriceBreakdownStruct: orderItem.PriceBreakdown, TimestampCreated: orderItem.TimestampCreated, TimestampCancelled: orderItem.TimestampCancelled, TimestampAwaitingPaymentSince: orderItem.TimestampAwaitingPaymentSince, } orderDBList = append(orderDBList, orderDB) } // 批量插入,GORM的Create方法原生支持传入切片自动批量写入 err = db.Create(&orderDBList).Error if err != nil { if pqErr, ok := err.(*pq.Error); ok && pqErr.Code.Name() == "unique_violation" { helpers.HandleErr(pqErr) } else { log.Fatalf("批量写入订单失败: %v", err) } }
补充说明
如果你的场景需要对单条订单做冲突处理(比如已有订单做更新而不是跳过),可以选择遍历切片时单条调用Create方法,批量插入的效率更高,适合全量同步订单的场景。
内容的提问来源于stack exchange,提问作者maes
相关产品推荐
相关产品推荐

