gpt4 book ai didi

database - Gorm 只返回一个而不是多个结果

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:01 24 4
gpt4 key购买 nike

我写了 blow 代码,它只返回 1 行而不是 4 行:

package main

import (
"fmt"

"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)

type Post struct {
gorm.Model
Title string
Text string
Comments []Comment
}

type Comment struct {
gorm.Model
Text string
PostID uint `gorm:"foreignkey:ID;association_foreignkey:PostID"`
}

func main() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect to database")
}
defer db.Close()

db.DropTableIfExists(&Post{}, &Comment{})
db.AutoMigrate(&Post{}, &Comment{})

// fill db
db.Create(&Post{Title: "test1 title", Text: "text1"})
db.Create(&Post{Title: "test2 title", Text: "text2"})
db.Create(&Post{Title: "test3 title", Text: "text3"})
db.Create(&Comment{Text: "test1 comment1", PostID: 3})
db.Create(&Comment{Text: "test2 comment1", PostID: 2})
db.Create(&Comment{Text: "test3 comment2", PostID: 2})
db.Create(&Comment{Text: "test4 comment3", PostID: 2})
db.Create(&Comment{Text: "test5 comment4", PostID: 2})
db.Create(&Comment{Text: "test6 comment1", PostID: 1})
//end fill db

var myPost Post
var comments Comment
db.First(&myPost, 2)
db.Model(&myPost).Related(&comments)

fmt.Println(myPost)
fmt.Println(comments)
}

这是我的输出:

{{2 2019-04-08 17:04:20.3781288 +0430 +0430 2019-04-08 17:04:20.3781288 +0430 +0430 <nil>} test2 title text2 []}
{{5 2019-04-08 17:04:20.4091133 +0430 +0430 2019-04-08 17:04:20.4091133 +0430 +0430 <nil>} test5 comment4 2}

你只能看到一行:

test5 comment4 

我期待这样的结果:

test2 comment1
test3 comment2
test4 comment3
test5 comment4

我应该怎么做才能得到 4 行结果?

我已经阅读了 gorm 的所有文档。并且这个文档示例并不像我预期的那样对我有用 http://doc.gorm.io/associations.html#has-many

Has Many
// User has many emails, UserID is the foreign key
type User struct {
gorm.Model
Emails []Email
}

type Email struct {
gorm.Model
Email string
UserID uint
}

db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111; // 111 is user's primary key

最佳答案

附件中有不少问题,将一一解决:

#1

type Post struct {
gorm.Model
Title string
Text string
Comments []Comment
}

type Comment struct {
gorm.Model
Text string
PostID uint `gorm:"foreignkey:ID;association_foreignkey:PostID"`
}

在这里,外键 foreignkey:ID 和关联外键的赋值都是不必要的和错位的

对于Foreign Key :默认情况下,gorm 使用所有者的类型名称加上其主键字段的名称。在您的情况下:PostID

  • Post所有者的类型名称
  • ID它的主键

如果您想更改Comment 结构中的字段名称,您只需要使用forignkey 标签。例如,PostNumber 而不是 PostID。因此,您需要使用 foreignkey:PostNumber 添加标签,并将 Comment 中的 PostID 更改为 PostNumber

对于Association ForeignKey , 如果你想告诉 gorm 使用所有者主键以外的其他成员,则使用它。例如,下面示例中的 AnotherID

另一个问题是您应该在 has many 字段而不是外键本身上指定这些标签。一个完整的示例如下所示:

type Post struct {
gorm.Model
AnotherID uint <-------------------------------------------------------
Title string |
Text string |
Comments []Comment `gorm:"foreignkey:PostNumber;association_foreignkey:AnotherID"`
} |
|
type Comment struct { |
gorm.Model |
Text string |
PostNumber uint <----------------------
}

请注意,这两个必须具有相同的类型。


#2

对于 defer db.Close() 的用法,人们可以争论不休。来自docs ,

It is rare to Close a DB, as the DB handle is meant to be long-lived and shared between many goroutines.

在此示例中,可以延迟 关闭数据库。但是,如果您不调用它,它会自动发生。我评论它的主要原因是要告诉您,在大型应用程序中,您不需要对每个连接都这样做。只需对全局变量调用 sql.Open() 并使用它而不需要 db.Close() 是安全的。

在这种情况下,您也不希望它随心所欲地打开尽可能多的连接,因此您可能需要微调以下参数:

db.DB().SetConnMaxLifetime(X) // sets the maximum amount of time a connection may be reused.
db.DB().SetMaxIdleConns(X) // sets the maximum number of connections in the idle connection pool.
db.DB().SetMaxOpenConns(X) // sets the maximum number of open connections to the database.

参见 this讨论以获取更多信息。


#3

以下调用可能失败:

db.DropTableIfExists(&Post{}, &Comment{})

db.AutoMigrate(&Post{}, &Comment{})

db.Create(&Post{Title: "test1 title", Text: "text1"})

因此,始终检查错误,您可以通过检查 gorm.DB 结构的 Error 成员来做到这一点:

err = db.DropTableIfExists(&Post{}, &Comment{}).Error
if err != nil {
// handle error
}

err = db.AutoMigrate(&Post{}, &Comment{}).Error
// Check error

err = db.Create(&Post{Title: "test1 title", Text: "text1"}).Error
// Check error

#4

这是您问题的答案:

您传递的不是 Comment 的 slice 给 db.Model(&myPost).Related(&comments) 并期望返回一个 slice ,这对明显的情况不起作用原因,所以你需要改变:

var comments Comment

var comments []Comment

关于database - Gorm 只返回一个而不是多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55573831/

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