使用goqu无法获取响应,查询正确且已连库但返回空
问题分析与解决
核心问题:你调用的
ToSQL()方法只负责生成SQL语句和对应的参数,根本没有执行数据库查询!所以你遍历的res只是参数列表,不是实际的查询结果,自然拿不到数据。修正方案:
- 让
CourseRepo持有数据库连接实例(goqu的DB对象或原生sql.DB都可以,推荐用goqu封装好的DB) - 使用goqu提供的查询执行方法(比如
Scan)直接把结果映射到你的courses切片 - 完善错误处理,出错时及时返回,避免后续无效执行
- 让
修正后的代码示例
// 先给CourseRepo添加db字段,用于持有数据库连接 type CourseRepo struct { db *goqu.DB } // 初始化Repo时传入已连接好的goqu.DB func NewCourseRepo(db *goqu.DB) *CourseRepo { return &CourseRepo{db: db} } func goquBuilder() goqu.DialectWrapper { return goqu.Dialect("postgres") } func (r *CourseRepo) GetAll() ([]Course, error) { var courses []Course // 直接用repo的db对象执行查询,自动把结果扫描到courses切片 err := r.db.From(goqu.S(schema).Table("courses")).Scan(&courses) if err != nil { clogger.Error(err) return nil, err // 出错时立刻返回错误,不要继续往下走 } // 如果需要查看生成的SQL,单独调用ToSQL即可 sqlStr, args, _ := r.db.From(goqu.S(schema).Table("courses")).ToSQL() fmt.Println("生成的SQL:", sqlStr) fmt.Println("SQL参数:", args) return courses, nil }
如果你想用原生sql.DB执行的替代方案
如果你的Repo持有的是原生sql.DB,也可以用生成的SQL和参数手动执行:
func (r *CourseRepo) GetAll() ([]Course, error) { var courses []Course query, args, err := goquBuilder().From(goqu.S(schema).Table("courses")).ToSQL() if err != nil { clogger.Error(err) return nil, err } rows, err := r.db.Query(query, args...) if err != nil { clogger.Error(err) return nil, err } defer rows.Close() // 手动遍历结果并扫描到结构体 for rows.Next() { var course Course // 注意:这里要按Course结构体的字段顺序填写扫描目标 if err := rows.Scan(&course.ID, &course.Name, &course.Description); err != nil { clogger.Error(err) return nil, err } courses = append(courses, course) } // 检查遍历过程中是否出现错误 if err := rows.Err(); err != nil { return nil, err } fmt.Println("执行的SQL:", query) return courses, nil }
内容的提问来源于stack exchange,提问作者Mike3355
相关产品推荐
相关产品推荐

