Go语言使用SQLBoiler如何为关联Hive表设置Limit、Offset和排序
问题原因
你之前在qm.Load中传入Limit/Offset的写法会触发panic,是因为SQLBoiler的qm.Load方法传入的查询修饰符,仅作用在关联数据的二次拉取逻辑上,不支持直接给主查询的关联表增加分页参数,会生成语法错误的SQL语句。
解决方法
这里提供两种可落地的实现方案,优先推荐第一种。
方案1:分两步查询(最稳妥)
先对Hive表做分页查询拿到目标hive_id集合,再用id集合查询关联的HiveUserDemographic数据:
// 第一步:分页查询Hive表,拿到符合条件的hive_id列表 hiveQueryMods := []qm.QueryMod{ qm.Where("deleted_at IS NULL"), qm.OrderBy("hive_id ASC"), qm.Limit(10), qm.Offset(0), qm.Select("hive_id"), // 仅查需要的字段,优化性能 } hives, err := dbmodels.Hives(hiveQueryMods...).All(ctx, m.db) if err != nil { // 自行处理错误逻辑 } // 提取hive_id列表,hive_id类型根据你的实际表结构调整即可 hiveIDs := make([]int64, 0, len(hives)) for _, hiveItem := range hives { hiveIDs = append(hiveIDs, hiveItem.HiveID) } // 第二步:查询对应hive_id的所有HiveUserDemographic记录,同时加载其他关联 demoQueryMods := []qm.QueryMod{ qm.WhereIn("hive_id IN ?", hiveIDs), qm.Load(dbmodels.HiveUserDemographicRels.Answer), qm.Load(dbmodels.HiveUserDemographicRels.Question), qm.Load(dbmodels.HiveUserDemographicRels.Hive), } demographic, err := dbmodels.HiveUserDemographics(demoQueryMods...).All(ctx, m.db)
该方案逻辑简单清晰,排查问题成本低,两次简单查询的性能开销远低于复杂嵌套子查询,是SQLBoiler官方推荐的同类场景实现方式。
方案2:单次子查询实现
如果你需要用单次查询完成逻辑,可以手动构造Hive分页子查询接入主查询:
import "github.com/volatiletech/sqlboiler/v4/queries" // 构造Hive分页子查询 hiveSubQuery := queries.NewQuery( "SELECT hive_id FROM hive WHERE deleted_at IS NULL ORDER BY hive_id ASC LIMIT 10 OFFSET 0", ) // 构造主查询 queryMods := []qm.QueryMod{ qm.InnerJoin("(?) AS hive_data ON hive_data.hive_id = hive_user_demographic.hive_id", hiveSubQuery), qm.Load(dbmodels.HiveUserDemographicRels.Answer), qm.Load(dbmodels.HiveUserDemographicRels.Question), qm.Load(dbmodels.HiveUserDemographicRels.Hive), } demographic, err := dbmodels.HiveUserDemographics(queryMods...).All(ctx, m.db)
内容的提问来源于stack exchange,提问作者Mia Mia
相关产品推荐
相关产品推荐

