Gin框架中Sqlboiler使用c.Query变量报错sql: no rows in result set求助
解决Gin中Sqlboiler处理Query参数返回
sql: no rows in result set的问题 问题根源
你在使用qm.WhereIn时存在两个关键错误:
- 错误地在
WhereIn的第一个参数中拼接了"name in ?",Sqlboiler的WhereIn会自动生成IN子句,手动拼接会导致最终SQL语句逻辑异常。 - 单个查询参数场景下误用了
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
相关产品推荐
相关产品推荐

