登录
首页 >  Golang >  Go问答

为何“属于”关系中的连接条目缺失?

来源:stackoverflow

时间:2024-03-19 21:54:33 147浏览 收藏

本文探讨了使用 GORM 框架定义关系型数据库表的问题,其中一个表(用户)拥有一对一关系的另一个表(卡)。尽管数据库中正确定义了关系,但程序在搜索用户时却返回了一个没有关联卡的空卡。这表明 GORM 不会自动加载嵌套对象,需要使用“preload”函数明确指定。文章详细解释了如何使用此函数解决问题,确保在搜索用户时加载关联的卡。

问题内容

下面是一个程序(基于gorm),它以用户拥有一张卡的逻辑定义了两个数据库表(userscards)。然后它创建数据库,填充数据库,搜索并打印出其中的唯一记录。

我的问题:最终搜索中的卡片是空的,它没有附加到用户。

从数据库角度来看,一切正常:

select * from users

id  name    card_id
1   john    1

select * from cards

id  number
1   42

请注意,第一个结果中的 card_id 正确指向卡的 id

为什么我上次搜索返回的是空卡?

package main

import (
    "fmt"

    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type User struct {
    ID     uint
    Name   string
    UserCard   Card
    CardID uint
}

type Card struct {
    ID     uint
    Number string
}

func main() {
    // initialize the database
    db, _ := gorm.Open(sqlite.Open("mytest.sqlite"), &gorm.Config{})
    db.AutoMigrate(&User{}, &Card{})
    // create one card
    db.Create(&Card{
        Number: "42",
    })
    // find that card
    var myCard Card
    db.Where(map[string]interface{}{"number": "42"}).First(&myCard)
    // create a user with that card
    db.Create(&User{
        Name: "john",
        UserCard: myCard,
    })
    // find that user
    var myUser User
    db.Where(map[string]interface{}{"name": "john"}).First(&myUser)
    // print his name and card number
    // the problem is here: the card number is empty, as if the card was not linked
    fmt.Printf("name: %v, number: %v", myUser.Name, myUser.UserCard.Number)
}

// output
// name: john, number: 


正确答案


go-gorm 不会自动加载嵌套对象,您必须指定要加载嵌套对象。在您的情况下, usercarduser 的嵌套对象。 Here 您可以查看有关如何使用 preload 函数执行此操作的更多详细信息,但它应该如下所示:

var myUser User
db.Preload("UserCard").Where(map[string]interface{}{"name": "john"}).First(&myUser)

本篇关于《为何“属于”关系中的连接条目缺失?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>