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

Gin框架中Sqlboiler使用c.Query变量报错sql: no rows in result set求助

解决Gin中Sqlboiler处理Query参数返回sql: no rows in result set的问题

问题根源

你在使用qm.WhereIn时存在两个关键错误:

  1. 错误地在WhereIn的第一个参数中拼接了"name in ?",Sqlboiler的WhereIn会自动生成IN子句,手动拼接会导致最终SQL语句逻辑异常。
  2. 单个查询参数场景下误用了WhereIn,WhereIn是专为多值匹配设计的,单个值查询应该使用qm.Where。

正确写法

场景1:单个name参数查询(URL示例:/user?name=John)

import (
    "errors"
    "net/http"
    "github.com/gin-gonic/gin"
    "database/sql"
    "<your-models-path>"
    "<your-query-models-path>"
)

func getUser(c *gin.Context){
    name := c.Query("name")
    if name == "" {
        c.JSON(http.StatusBadRequest, gin.H{"error": "name参数不能为空"})
        return
    }

    // 数据库查询逻辑
    user, err := models.Users(
        qm.Where("name = ?", name),
    ).One(ctx, db)
    if err != nil {
        if errors.Is(err, sql.ErrNoRows) {
            c.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
            return
        }
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, user)
}

场景2:多个name参数查询(URL示例:/user?name=John&name=Jane)

如果需要支持多值查询,用c.QueryArray获取参数切片,再配合WhereIn:

import (
    "net/http"
    "github.com/gin-gonic/gin"
    "<your-models-path>"
    "<your-query-models-path>"
)

func getUser(c *gin.Context){
    names := c.QueryArray("name")
    if len(names) == 0 {
        c.JSON(http.StatusBadRequest, gin.H{"error": "name参数不能为空"})
        return
    }

    // 数据库查询逻辑
    users, err := models.Users(
        qm.WhereIn("name", names...),
    ).All(ctx, db)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, users)
}

补充说明

你硬编码时能运行属于巧合,错误的WhereIn("name in ?", name)写法会生成逻辑异常的SQL,只是刚好匹配到了数据。规范使用Sqlboiler的查询构造器才能稳定避免这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:55:18