如何用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
相关产品推荐
相关产品推荐

