面试题答案
一键面试package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// Author 作者结构体
type Author struct {
ID uint
Name string
Books []Book
}
// Book 书籍结构体
type Book struct {
ID uint
Title string
AuthorID uint
}
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移表
db.AutoMigrate(&Author{}, &Book{})
// 查询所有有至少3本书的作者信息
var authors []struct {
Name string
BookCount int
}
db.Model(&Author{}).
Select("authors.name, COUNT(books.id) as book_count").
Joins("JOIN books ON authors.id = books.author_id").
Group("authors.id").
Having("COUNT(books.id) >= 3").
Scan(&authors)
// 打印结果
for _, author := range authors {
println(author.Name, author.BookCount)
}
}
说明:
- 定义了
Author
和Book
两个结构体,通过在Author
结构体中嵌入Books []Book
来建立一对多关系。 - 使用
gorm.Open
连接SQLite数据库,并使用AutoMigrate
自动迁移表结构。 - 使用
db.Model(&Author{})
指定从Author
表开始查询。 Select
指定需要查询的字段,包括作者名和书的数量(使用别名book_count
)。Joins
通过JOIN
语句连接books
表,关联条件是authors.id = books.author_id
。Group
按authors.id
进行分组。Having
过滤出拥有至少3本书的作者,COUNT(books.id) >= 3
表示书的数量至少为3。- 最后使用
Scan
将查询结果扫描到authors
切片中。