Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang gorm-使用深度嵌套模型预加载_Go_Go Gorm - Fatal编程技术网

Golang gorm-使用深度嵌套模型预加载

Golang gorm-使用深度嵌套模型预加载,go,go-gorm,Go,Go Gorm,我有以下人为的例子: type Top struct { ID uint `gorm:"primary_key"` Name string Middle []*Middle } type Middle struct { ID uint `gorm:"primary_key"` TopID int Name string Low []*Low } type Low struct { ID uint `gorm:"primary

我有以下人为的例子:

type Top struct {
  ID     uint `gorm:"primary_key"`
  Name   string
  Middle []*Middle
}

type Middle struct {
  ID    uint `gorm:"primary_key"`
  TopID int
  Name  string
  Low   []*Low
}

type Low struct {
  ID       uint `gorm:"primary_key"`
  MiddleID int
  Name     string
  Bottom   []*Bottom
}

type Bottom struct {
  ID    uint `gorm:"primary_key"`
  LowID int
  Name  string
}
top := Top{
  Name: "Top",
  Middle: []*Middle{
    {
      Name: "Middle",
      Low: []*Low{
        {
          Name: "Low",
          Bottom: []*Bottom{
            {
              Name: "Bottom",
            },
          },
        },
      },
    },
  },
}

if err := db.Save(&top).Error; err != nil {
  log.Fatal("Got errors when saving calc", err.Error())
}

if err := db.Where("id = 1").
  Preload("Middle.Low.Bottom").
  First(&top).Error; err != nil {
  log.Fatal(err)
}
这为我提供了以下输出:

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:81)
[2016-03-18 01:53:23]  [4.37ms]  INSERT INTO "tops" ("name") VALUES ('Top') RETURNING "tops"."id"

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:81)
[2016-03-18 01:53:23]  [3.49ms]  INSERT INTO "middles" ("name","top_id") VALUES ('Middle','1') RETURNING "middles"."id"

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:81)
[2016-03-18 01:53:23]  [1.07ms]  INSERT INTO "lows" ("middle_id","name") VALUES ('1','Low') RETURNING "lows"."id"

()
[2016-03-18 01:53:23]  [9.16ms]  INSERT INTO "bottoms" ("low_id","name") VALUES ('1','Bottom') RETURNING "bottoms"."id"

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:86)
[2016-03-18 01:53:23]  [1.54ms]  SELECT  * FROM "tops"   ORDER BY "tops"."id" ASC LIMIT 1

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:88)
[2016-03-18 01:53:23]  [2.63ms]  SELECT  * FROM "tops"  WHERE ("id" = '1') ORDER BY "tops"."id" ASC LIMIT 1

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:88)
[2016-03-18 01:53:23]  [1.65ms]  SELECT  * FROM "middles"  WHERE (top_id IN ('1')) ORDER BY "middles"."id" ASC

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:88)
[2016-03-18 01:53:23]  [4.20ms]  SELECT  * FROM "lows"  WHERE (middle_id IN ('1')) ORDER BY "lows"."id" ASC

(/host_home/workspace/golang/src/bitbucket.org/cloudgloballog/gormtest/main.go:88)
[2016-03-18 01:53:23]  can't find field Bottom in []**main.Low
如果我只嵌套Top->Middle->Low,并调用
Preload(“Middle.Low”)
它就可以正常工作。线索可能在双指针引用
[]**main.Low
中,但我无法确定如何正确执行此操作


嵌套预加载可能不支持此级别。有人知道吗?

这个问题似乎已经出现在gorm的早期版本中,如中所述:,,但最新的预加载问题修复已经出现

它似乎已经解决了相当长的一段时间,但它被修复的确切版本没有文档记录,除非有人搜索git提交日期

使用最新版本(撰写本文时为v1.9.11)设置当前示例没有任何问题

主程序包
进口(
“日志”
“github.com/daveggh/go-spew/spew”
“github.com/jinju/gorm”
_“github.com/jinzhu/gorm/dialogs/sqlite”
)
类型顶部结构{
ID uint`gorm:“主键”`
名称字符串
中[]*中
}
类型中间结构{
ID uint`gorm:“主键”`
TopID int
名称字符串
低[]*低
}
类型低结构{
ID uint`gorm:“主键”`
米德里德国际酒店
名称字符串
底部[]*底部
}
类型底部结构{
ID uint`gorm:“主键”`
LowID int
名称字符串
}
func main(){
db,err:=gorm.Open(“sqlite3”,“test.db”)
如果错误!=零{
死机(“连接数据库失败”)
}
延迟db.Close()
//启用日志记录器,显示详细日志
db.LogMode(真)
//迁移模式
db.AutoMigrate(&Top{})
db.AutoMigrate(&Middle{})
db.AutoMigrate(&Low{})
db.AutoMigrate(&Bottom{})
顶部:=顶部{
名称:“顶部”,
中间:[]*中间{
{
名称:“中”,
低:[]*低{
{
名称:“低”,
底部:[]*底部{
{
名称:“底部”,
},
},
},
},
},
},
}
如果错误:=db.Save(&top)。错误;错误!=nil{
log.Fatal(“保存计算时出错”,err.Error())
}
var ntop顶部
如果错误:=db.Where(“id=1”)。
预加载(“中、低、底”)。
第一个(&ntop)。错误;错误!=nil{
log.Fatal(错误)
}
排放转储(&ntop)
}
$。/main.exe
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:70)
[2019-10-3114:44:23][2.00ms]插入“顶部”(“名称”)值(“顶部”)
[1行受影响或返回]
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:70)
[2019-10-3114:44:23][0.00ms]插入“中间点”(“顶部id”,“名称”)值(1,“中间点”)
[1行受影响或返回]
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:70)
[2019-10-3114:44:23][0.99ms]插入“低”(“中间id”,“名称”)值(1,“低”)
[1行受影响或返回]
()
[2019-10-3114:44:23][0.00ms]插入“底部”(“低id”,“名称”)值(1,“底部”)
[1行受影响或返回]
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:76)
[2019-10-3114:44:23][0.00ms]从“tops”中选择*,其中(id=1)按“tops”排序。“id”ASC限制1
[1行受影响或返回]
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:76)
[2019-10-3114:44:23][0.00ms]从“中间商”中选择*,其中(“第(1)项中的顶部id”)按“中间商”排序。“id”ASC
[1行受影响或返回]
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:76)
[2019-10-3114:44:23][0.00ms]从“低点”中选择*,其中(1)中的“中间id”按“低点”排序。“id”ASC
[1行受影响或返回]
(C:/Users/fakename/source/stackoverflow/go/gorm-nested/main.go:76)
[2019-10-3114:44:23][0.99ms]从“底部”中选择*,其中(1)中的“低id”按“底部”排序
[1行受影响或返回]
(*main.Top)(0xc00015f950)({
ID:(uint)1,
名称:(字符串)(len=3)“顶部”,
中间:([]*正中)(len=1 cap=1){
(*main.Middle)(0xc000150fc0)({
ID:(uint)1,
TopID:(int)1,
名称:(字符串)(len=6)“中间”,
低:([]*主。低)(len=1 cap=1){
(*主电源电压过低)(0xc000151080)({
ID:(uint)1,
MiddleID:(int)1,
名称:(字符串)(len=3)“低”,
底部:([]*main.Bottom)(len=1 cap=1){
(*主底部)(0xc0001929c0)({
ID:(uint)1,
洛维德:(int)1,
名称:(字符串)(len=6)“底部”
})
}
})
}
})
}
})

对上述代码有任何建议,即使我正在寻找嵌套预加载。