PostgreSQL批量插入user_subservices时UUID数组参数传递异常求助
解决方案
方法1:修正SQL语句,直接使用unnest($1)
GORM会自动将[]uuid.UUID类型映射为PostgreSQL的uuid数组,无需手动用Array[]包裹。修改SQL语句为:
INSERT INTO user_subservices (user_id, subservice_id) SELECT unnest($1::uuid[]), $2
执行代码保持不变:
err := db.dbConn.DB.Debug().Exec(q, users, Id).Error
用SELECT替代VALUES是因为unnest返回行集,更适配这种批量关联插入的场景。
方法2:使用GORM原生批量插入(适合小批量场景)
如果user_id数组长度不大,可以组装结构体切片,用GORM的批量插入方法:
type UserSubservice struct { UserID uuid.UUID `gorm:"column:user_id"` SubserviceID uuid.UUID `gorm:"column:subservice_id"` } var records []UserSubservice for _, u := range users { records = append(records, UserSubservice{UserID: u, SubserviceID: Id}) } err := db.dbConn.CreateInBatches(records, len(records)).Error
这种写法更贴合GORM的惯用逻辑,框架会自动生成正确的批量INSERT语句。
方法3:手动转换参数类型(兜底方案)
若要沿用原有VALUES写法,可借助lib/pq包将uuid数组转为PostgreSQL可识别的类型:
import "github.com/lib/pq" // 将uuid数组转为字符串数组 userIDs := pq.StringArray{} for _, u := range users { userIDs = append(userIDs, u.String()) } q := `INSERT INTO user_subservices (user_id, subservice_id) VALUES (unnest($1::uuid[]), $2)` err := db.dbConn.DB.Debug().Exec(q, userIDs, Id).Error
问题根源
你原SQL中的Array[$1]会把传入的一维数组再嵌套成二维数组,导致unnest解析失败。GORM已经完成了[]uuid.UUID到PostgreSQL一维uuid数组的映射,不需要额外包裹Array[]。
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

