Postgresql 如何插入切片

Postgresql 如何插入切片,postgresql,go,gorp,Postgresql,Go,Gorp,我有一个postgres db,我想使用Gorp为其生成表并向其写入,但是当我尝试插入时,由于我的结构中包含的切片“sql:转换参数$4类型:不受支持的类型[]core.EmbeddedStruct,一个struct切片,因此会收到一条错误消息 我的结构如下所示: 类型Struct1 struct{ ID字符串 名称字符串 位置字符串 EmbeddedStruct[]EmbeddedStruct } 类型EmbeddedStruct{ ID字符串 名称字符串 struct1Id字符串 Embe

我有一个postgres db,我想使用Gorp为其生成表并向其写入,但是当我尝试插入时,由于我的结构中包含的切片“sql:转换参数$4类型:不受支持的类型[]core.EmbeddedStruct,一个struct切片,因此会收到一条错误消息

我的结构如下所示:

类型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...)
}