首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go-Gorm中的深层嵌套结构

Go-Gorm中的深层嵌套结构
EN

Stack Overflow用户
提问于 2019-08-06 09:26:12
回答 1查看 702关注 0票数 1

我在Go上使用Gorm和PostgreSQL创建了一个http服务,我遇到了一些奇怪的事情。我有一个三层的库嵌套模型:

代码语言:javascript
复制
type Page struct {
    ID int64 `sql:"auto_increment" json:"-"`
    Number int64 `json:"number"`
    Book Book `gorm:"foreignkey:book_id" json:"-"`
    BookID int64 `json:"book_id"`
    Text string `json:"text"`
}

type Book struct {
    ID int64 `sql:"auto_increment" json:"-"`
    ShelfPlace int64 `json:"shelf_place"`
    Shelf Shelf `gorm:"foreignkey:shelf_id" json:"-"`
    ShelfID int64 `json:"shelf_id"`
    Author string `json:"author"`
    Publisher string `json:"publisher"`
    PagesAmount int64 `json:"pages_amount"`
}

type Shelf struct {
    ID int64 `sql:"auto_increment" json:"-"`
    Number int64 `json:"number"`
    BooksAmount int64 `json:"books_amount"`
    Book []Book `json:"books"`
}

如你所见,书属于书架,书页属于书。然后,我添加以下json来测试它:

代码语言:javascript
复制
{
  "number": 1,
  "books": [
    {
      "shelf_place": 5,
      "author": "Lewis Carroll",
      "publisher": "EA",
      "pages_amount": 2,
      "pages": [
        {
          "number": 2,
          "text": "lorem ipsum"
        },
        {
          "number": 4,
          "text": "dolor sit amet"
        }
      ]
    },
    {
      "shelf_place": 7,
      "author": "Mark Twain",
      "publisher": "Activision",
      "pages_amount": 3,
      "pages": [
        {
          "number": 1,
          "text": "this is"
        },
        {
          "number": 3,
          "text": "a test"
        },
        {
          "number": 6,
          "text": "of json"
        }
      ]
    }
  ]
}

虽然书籍实际上与书架、书页一起添加到数据库中...不要这样做,没有任何错误信息,恐慌,任何东西-即使我认为我非常严格地检查错误。它们似乎都以完全相同的方式联系在一起--为什么不添加呢?下面是添加函数,尽管我怀疑这就是问题所在。

代码语言:javascript
复制
func requestShelfAdd(w http.ResponseWriter, r *http.Request) {
    var newShelf Shelf
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&newShelf)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Println("Error when decoding JSON: %v", err)
        fmt.Fprintf(w, "Error when decoding JSON: %v", err)
        return
    }
    err = shelfStore.Create(&newShelf) //shelfStore just stores current DB connection. Not much there, but I can give it to you if you want it
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        fmt.Fprintf(w, "Error when writing to database: %v", err)
        fmt.Println("Error when writing to database: %v", err)
        return
    }
    encoder := json.NewEncoder(w)
    err = encoder.Encode(newShelf)
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        fmt.Fprintf(w, "Error when encoding JSON: %v", err)
        fmt.Println("Error when encoding JSON: %v", err)
        return
    }
}

我会在谷歌上搜索问题所在,但老实说...我甚至不知道从哪里开始。是不是我的json出了什么问题?似乎不是这样的。我的结构?看起来一模一样。这非常令人困惑。

EN

回答 1

Stack Overflow用户

发布于 2019-08-07 00:46:50

这确实是一个bug,而且bug存在于Book结构中。它没有可以读取页面的字段,因此json中的页面实际上在解码级别上被忽略了。

Book应该看起来像这样才能正常工作:

代码语言:javascript
复制
type Book struct {
    ID int64 `sql:"auto_increment" json:"-"`
    ShelfPlace int64 `json:"shelf_place"`
    Shelf Shelf `gorm:"foreignkey:shelf_id" json:"-"`
    ShelfID int64 `json:"shelf_id"`
    Author string `json:"author"`
    Publisher string `json:"publisher"`
    PagesAmount int64 `json:"pages_amount"`
    Page []Page `json:"pages"`         //This was missing
}

好吧,那是个愚蠢的错误,抱歉打扰你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57367780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档