Postgresql 如何插入切片
我有一个postgres db,我想使用Gorp为其生成表并向其写入,但是当我尝试插入时,由于我的结构中包含的切片“sql:转换参数$4类型:不受支持的类型[]core.EmbeddedStruct,一个struct切片,因此会收到一条错误消息 我的结构如下所示:Postgresql 如何插入切片,postgresql,go,gorp,Postgresql,Go,Gorp,我有一个postgres db,我想使用Gorp为其生成表并向其写入,但是当我尝试插入时,由于我的结构中包含的切片“sql:转换参数$4类型:不受支持的类型[]core.EmbeddedStruct,一个struct切片,因此会收到一条错误消息 我的结构如下所示: 类型Struct1 struct{ ID字符串 名称字符串 位置字符串 EmbeddedStruct[]EmbeddedStruct } 类型EmbeddedStruct{ ID字符串 名称字符串 struct1Id字符串 Embe
类型Struct1 struct{
ID字符串
名称字符串
位置字符串
EmbeddedStruct[]EmbeddedStruct
}
类型EmbeddedStruct{
ID字符串
名称字符串
struct1Id字符串
EmbeddedStruct2[]EmbeddedStruct2
}
类型EmbeddedStruct2 struct{
ID字符串
名称字符串
embeddedStructId字符串
}
Gorp支持插入多个切片,因此如果您有一个切片记录
,您可以执行以下操作:
err = db.Insert(records...)
但是,从您的问题来看,您似乎希望保存一条具有slice struct字段的记录
gorp对结构之间的关系一无所知(至少现在还不知道)
所以,你必须自己处理这段关系。我个人解决这个问题的方法是:
然后使用PostInsert
保存EmbeddedStruct
(旁注,这是一个糟糕的名称,因为它实际上不是一个
然后在EmbeddedStruct2
上重复该过程
注意在数据库端正确设置关系,以确保引用完整性(例如,在DELETE CASCADE/RESTRICT上),最好将整个内容包装在事务中。谢谢!这对我很有效!只需一个更正,insert要求其参数的类型为[]接口{}因此,在插入可变数量的切片之前,需要先将s.EmbeddedStruct转换为该结构
type Struct1 struct {
ID string
Name string
Location string
EmbeddedStruct []EmbeddedStruct `db:"-"`
}
func (s *Struct1) PostInsert(sql gorp.SqlExecutor) error {
for i := range s.EmbeddedStruct {
s.EmbeddedStruct[i].struct1Id = s.ID
}
return sql.Insert(s.EmbeddedStruct...)
}