You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BunDB按作者研究生院名称筛选并查询书籍全量信息?

问题:按作者研究生院名称筛选书籍并获取全部详细信息

需求

按作者的研究生院名称筛选书籍,并获取这些书籍的全部详细信息(包含作者、出版社、作者的高中和研究生院信息)。

已定义结构体

type Book struct {
    bun.BaseModel `bun:"table:book"`

    AuthorID        uint32    `bun:"author_id"`
    PublisherID     uint32    `bun:"publisher_id"`
    
    Author    *Author              `bun:"rel:belongs-to,join:author_id=id"`
    Publisher *Publisher           `bun:"rel:belongs-to,join:publisher_id=id"`
}

type Author struct {
    bun.BaseModel `bun:"table:author"`

    ID uint32 `bun:"id,pk"`
    Name      string    `bun:"name"`

    // 原结构体关联字段错误,已修正
    HighSchoolID uint32    `bun:"high_school_id"`
    HighSchool   *School `bun:"rel:belongs-to,join:high_school_id=id"`

    GradSchoolID uint32    `bun:"grad_school_id"`
    GradSchool   *School `bun:"rel:belongs-to,join:grad_school_id=id"`
}

type Publisher struct {
    bun.BaseModel `bun:"table:publisher"`

    ID        uint32    `bun:"id,pk"`
    Name      string    `bun:"name"`
}

type School struct {
    bun.BaseModel `bun:"table:school"`

    ID        uint32    `bun:"id,pk"`
    Name      string    `bun:"name"`
}

尝试的错误查询代码

repo.db.
Reader().
NewSelect().
Model(&Book{}).
Relation("Author").
Relation("Publisher").
Relation("Author.HighSchool").
Relation("Author.GradSchool").
Where("grad_school.name = ?", "grad_school_name").
Scan(ctx)

解决方案

1. 修正结构体关联错误

原Author结构体中HighSchool的关联配置有误:HighSchool的join字段应对应high_school_id,而非grad_school_id,否则会导致作者的高中和研究生院错误关联到同一所学校。修正后的结构体如上所示。

2. 修正查询语句的WHERE子句

直接写grad_school.name会导致SQL无法识别表别名,Bun处理嵌套关联时,需要通过完整的关系路径引用关联表字段。

正确查询代码

var books []Book
err := repo.db.
    Reader().
    NewSelect().
    Model(&books).
    // 加载所有需要的关联关系
    Relation("Author").
    Relation("Publisher").
    Relation("Author.HighSchool").
    Relation("Author.GradSchool").
    // 使用完整关系路径筛选研究生院名称
    Where("author.grad_school.name = ?", "目标研究生院名称").
    Scan(ctx)

if err != nil {
    // 处理错误逻辑
}

防SQL注入的严谨写法

如果需要避免SQL注入风险,可以使用bun.Ident标识字段路径:

import "github.com/uptrace/bun"

// ...

Where("? = ?", bun.Ident("author.grad_school.name"), "目标研究生院名称")

原理说明

Bun处理Relation("Author.GradSchool")时,会自动生成关联表的别名,但通过author.grad_school这种关系路径,Bun可以直接解析为正确的表别名和字段名,确保筛选条件生效。

内容的提问来源于stack exchange,提问作者Sanket Bijawe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:32:08