当前位置: 首页 > 面试题库 >

使用GORM选择相关字段

单耘豪
2023-03-14
问题内容

我是来自python背景的Golang的新手,所以尝试了解新的和不同的概念。我正在尝试创建相关字段,然后从数据库中选择它们。

楷模:

type Company struct {
    gorm.Model
    Name string
}

type CreditCard struct {
    gorm.Model
    Number    int
    Company   Company
    CompanyId uint
}

type User struct {
    gorm.Model
    Name         string
    CreditCard   CreditCard
    CreditCardID uint
}

创建表和行并从数据库中选择

common.DB.AutoMigrate(
    &Company{},
    &CreditCard{},
    &User{},
)

user := User{
    Name:       "Alice",
    CreditCard: CreditCard{Number: 123456, Company: Company{Name: "Bank A"}},
}

common.DB.Create(&user)

var retrivedUser User
var creditCard CreditCard
var company Company
common.DB.First(&retrivedUser, 1).Related(&creditCard).Related(&company)

fmt.Println("user name", retrivedUser.Name)
fmt.Println("creditcard number", retrivedUser.CreditCard.Number)
fmt.Println("creditcard number related", creditCard.Number)
fmt.Println("company name", retrivedUser.CreditCard.Company.Name)
fmt.Println("company name related", company.Name)

打印:

user name Alice
creditcard number 0
creditcard number related 123456
company name 
company name related

两个问题:

  1. 为什么我需要选择RelatedcreditCard作为单独的变量而不是使用点符号?
  2. invalid association []Related公司上遇到错误,并且没有点符号或相关工作。我该如何取回?

问题答案:

根据文件,你需要设置auto_preloadtrue进行自动预加载工作。因此,将检索用户的行更改为:

common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1)

应该给您预期的结果。

On a side note, never ignore the errors. You can always append .Error to
almost every operation in gorm and check the returned error. For example:

err = common.DB.AutoMigrate(...).Error
if err != nil {
    // handle err
}

err = common.DB.Create(&user).Error
// Check for err
err = common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1).Error
// Check for err


 类似资料:
  • 问题内容: 我一直在尝试找到一种使用Golang尤其是库gorm插入和检索几何类型的方法。我还尝试使用库orb,它为几何定义了不同的类型,并提供了不同格式之间的编码/解码。 Orb 已经为每种类型实现了和方法。这使得go’s 和函数可以使用除基本类型以外的其他类型。但是,Orb期望使用以众所周知的二进制(WKB)格式表示的几何。 orb文档显示,要实现此目的,您只需将字段包装在PostGIS函数中

  • 问题内容: 假设我有一个Author表和一个Post表,每个Author可以有多个Post。 现在,随着单SQLAlchemy的查询,我想我所有的活跃作者和最近发布的帖子为每个。 我一直在尝试通过获取子列表来加入作者的工作列表,使用子查询将结果分组在一起,如下所示: 但是,如果我有两个来自同一发布日期的Author帖子,而这些帖子是最新的Posts,则意味着我得到那个Author在我的结果列表中出

  • 我很难理解Django ORM中的和。我有以下型号: 现在我的views.py: 但是现在,每次for循环迭代时,它都会访问数据库3次。我试图提高时间复杂度——现在是3N 2,N是城市的数量,但是我不能理解select_related和prefetch_related。 你能给我一个例子,我该如何改进它,使它不会在for循环中命中数据库3次吗?

  • 我首先尝试了用户图,但是由于我们要获取组,所以我尝试了组图。同样的例外。 问题是,没有简单的方法向生成的查询添加,因为我不知道应该加入关联的哪些属性。我必须加载Entitygraph,遍历它和任何子图,并生成正确的join子句。 关于查询生成的更多细节: queryException:查询指定了连接提取,但是提取的关联的所有者不在选择列表中

  • 问题内容: 对此不熟悉,尝试按照著名的Flask教程使用Flask-bootstrap,Flask-wtforms,Jinja等构建一个应用程序 我有一个带有2个选择字段和一个按钮的表单。 我只希望第一个字段预先填充,而另一个字段根据前一个字段的选定值填充(在客户端?)。 在模板中,我尝试类似 可以正常工作(只要我返回元组列表以使用正确的javascript和路由填充下一个字段),但我想要以下内容

  • 问题内容: 我正在使用grails 1.3.7和zkoss,并且我的域模型如下所示,我在会话1中加载Person实体,并通过UI对其进行更改。 在会话2中单击保存时,我要保存实体。 因此,从我的作曲者/控制器中,我调用了一个服务方法(transactional),然后调用了person.save(),当我看到被触发的sql查询时,我看到了一个试图检索雇员对象的查询。 之后,保存被触发并引发nonu