gpt4 book ai didi

postgresql - 如何插入 slice

转载 作者:行者123 更新时间:2023-12-01 22:17:04 25 4
gpt4 key购买 nike

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

我的结构如下所示:

type Struct1 struct {
ID string
Name string
Location string
EmbeddedStruct []EmbeddedStruct
}

type EmbeddedStruct struct {
ID string
Name string
struct1Id string
EmbeddedStruct2 []EmbeddedStruct2
}

type EmbeddedStruct2 struct {
ID string
Name string
embeddedStructId string
}



func (repo *PgStruct1Repo) Write(t *core.Struct1) error {
trans, err := createTransaction(repo.dbMap)
defer closeTransaction(trans)

if err != nil {
return err
}

// Check to see if struct1 item already exists
exists, err := repo.exists(t.ID, trans)
if err != nil {
return err
}

if !exists {
log.Debugf("saving new struct1 with ID %s", t.ID)
err = trans.Insert(t)
if err != nil {
return err
}
return nil
}

return nil
}


是否有人对Gorp是否支持插入 slice 有任何经验?从我阅读的内容来看,它似乎仅支持SELECT语句的 slice

最佳答案

Gorp支持插入数量为variadic的 slice ,因此,如果您有 slice records,则可以执行以下操作:

 err = db.Insert(records...)

但是,从您的问题来看,您似乎想保存一条包含 slice 结构字段的记录。

https://github.com/go-gorp/gorp

gorp对您的结构之间的关系一无所知(至少现在还不知道)。

因此,您必须自己处理这种关系。我个人解决此问题的方法是使用 Gorp ignore the slice on the parent:
type Struct1 struct {
ID string
Name string
Location string
EmbeddedStruct []EmbeddedStruct `db:"-"`
}

然后使用 PostInsert hook保存 EmbeddedStruct(注意,由于它实际上不是 embedded struct,因此名称不正确)
func (s *Struct1) PostInsert(sql gorp.SqlExecutor) error {
for i := range s.EmbeddedStruct {
s.EmbeddedStruct[i].struct1Id = s.ID
}
return sql.Insert(s.EmbeddedStruct...)
}

然后在 EmbeddedStruct2上重复该过程。

注意在数据库端正确设置关系以确保引用完整性(例如在DELETE CASCADE / RESTRICT上),将整个内容包装在事务中可能是一个好主意。

关于postgresql - 如何插入 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58962574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com