gorm 的 bug???

我想查用户表里面的手机号带131的所有数据,下面只是随便大致写的gorm查询,发现一个bug:
查出来的结果只包含:XXX131XXX的数据,居然不包含 131XXX 的数据,不知道你们大家是不是也这样,还是只是说我写法错了,但是代码可以跑起来,也能出结果哦,大家试试看吧。
测出BUG的代码如下:

type UserSearch struct {
    Page int `json:"page"`
    Size int `json:"size"`
    Phone string `json:"phone"`
}

type Response struct {
   Code int `json:"code"`
  Message string `json:"message"`
  Data interface{} `json:"data"`
  Total int `json:"total"`
  PerPage int `json:"per_page"`
  CurrentPage int `json:"current_page"`
  TotalPage int `json:"total_page"`
}

type User struct {
    Id             int        `gorm:"column:id; primary_key" json:"id"`
    Name           string     `gorm:"column:name" json:"name"`
    Pid            *int       `gorm:"column:pid" json:"pid"`
    Phone          string     `gorm:"column:phone" json:"phone"`
    Cid            *string    `gorm:"column:cid" json:"cid"`
    IsRoot         int        `gorm:"column:is_root" json:"is_root"` 
    LastLoginTime  *time.Time `gorm:"column:last_login_time" json:"last_login_time"`
    LastLogoutTime *time.Time `gorm:"column:last_logout_time" json:"last_logout_time"`
    CreatedAt      *time.Time `gorm:"column:created_at" json:"created_at"`
    UpdatedAt      *time.Time `gorm:"column:updated_at" json:"updated_at"`
}

// POST请求
func UserIndex(c *gin.Context) {
    //phone := c.Query("phone")
    //size, err := strconv.Atoi(c.DefaultQuery("size", "10"))
    //page, err := strconv.Atoi(c.DefaultQuery("page", "1"))

    var search UserSearch
    err := c.BindJSON(&search)

    if err != nil {
        c.JSON(http.StatusOK, gin.H{
            "code": 500,
            "message":  "数据转换出错,请重试",
        })
    }

    var rows *sql.Rows
    if search.Page > 0 {
        query := databases.DB.Table("users").Order("created_at desc").
        Offset((search.Page-1)*search.Page).Limit(search.Size)
        if search.Phone != "" {
            query = query.Where("phone LIKE ?", "%"+search.Phone+"%")
        }
        rows, err = query.Rows()
    } else {
        query := databases.DB.Table("users").Order("created_at desc")
        if search.Phone != "" {
            query = query.Where("phone LIKE ?", "%"+search.Phone+"%")
        }
        rows, err = query.Rows()
    }
    if err != nil {
        fmt.Println(err.Error())
        c.JSON(http.StatusOK, gin.H{
            "code": 500,
            "message":  "数据查询出错,请重试",
        })
        return
    }

    defer rows.Close()

    users := make([]*User, 0)

    for rows.Next() {
        var user User
        _ = databases.DB.ScanRows(rows, &user)
        users = append(users, &user)
    }
    count := UserCount()

    var response Response
    response.Code = 0
    response.Message = "success"
    response.Data = users
    response.Total = count
    response.PerPage = search.Size
    response.CurrentPage = search.Page
    response.TotalPage = (count + search.Size - 1) / search.Size

    c.JSON(http.StatusOK, response)
}

func UserCount() int {
   var count int
   databases.DB.Model(&User{}).Count(&count)
   return count
}

补充: 在GET请求下并用 c.Query() 接收查询参数时没有此BUG,如下面代码。

package controllers

import (
    "TongJiHouTai/gin/databases"
    "database/sql"
    "fmt"
    "github.com/gin-gonic/gin"
    "net/http"
    "strconv"
    "time"
)

type UserSearch struct {
    Page int `json:"page"`
    Size int `json:"size"`
    Phone string `json:"phone"`
}

type User struct {
    Id             int        `gorm:"column:id; primary_key" json:"id"`
    Name           string     `gorm:"column:name" json:"name"` 
    Pid            *int       `gorm:"column:pid" json:"pid"`   
    Phone          string     `gorm:"column:phone" json:"phone"`
    Cid            *string    `gorm:"column:cid" json:"cid"`
    IsRoot         int        `gorm:"column:is_root" json:"is_root"` 
    LastLoginTime  *time.Time `gorm:"column:last_login_time" json:"last_login_time"`
    LastLogoutTime *time.Time `gorm:"column:last_logout_time" json:"last_logout_time"`
    CreatedAt      *time.Time `gorm:"column:created_at" json:"created_at"`
    UpdatedAt      *time.Time `gorm:"column:updated_at" json:"updated_at"`
}

func UserIndex(c *gin.Context) {
    phone := c.Query("phone")
    size, err := strconv.Atoi(c.DefaultQuery("size", "10"))
    page, err := strconv.Atoi(c.DefaultQuery("page", "1"))

    if err != nil {
        c.JSON(http.StatusOK, gin.H{
            "code": 500,
            "message":  "数据转换出错,请重试",
        })
    }

    var rows *sql.Rows
    if page > 0 {
        query := databases.DB.Table("users").Order("created_at desc").
            Offset((page-1)*page).Limit(size)
        if phone != "" {
            query = query.Where("phone LIKE ?", "%"+phone+"%")
        }
        rows, err = query.Rows()
    } else {
        query := databases.DB.Table("users").Order("created_at desc")
        if phone != "" {
            query = query.Where("phone LIKE ?", "%"+phone+"%")
        }
        rows, err = query.Rows()
    }
    if err != nil {
        fmt.Println(err.Error())
        c.JSON(http.StatusOK, gin.H{
            "code": 500,
            "message":  "数据查询出错,请重试",
        })
        return
    }

    defer rows.Close()

    users := make([]*User, 0)

    for rows.Next() {
        var user User
        _ = databases.DB.ScanRows(rows, &user)
        users = append(users, &user)
    }
    count := UserCount()

    var response Response
    response.Code = 0
    response.Message = "success"
    response.Data = users
    response.Total = count
    response.PerPage = size
    response.CurrentPage = page
    response.TotalPage = (count + size - 1) / size

    c.JSON(http.StatusOK, response)
}

func UserCount() int {
   var count int
   databases.DB.Model(&User{}).Count(&count)
   return count
}
最佳答案

gorm有调试模式,你看具体执行的sql文本是怎么样的.我用GORM没遇到这样的问题

3年前 评论
讨论数量: 5

query.Where("search.Phone LIKE ?", "%"+search.Phone+"%") 这样能查出来?

3年前 评论

gorm有调试模式,你看具体执行的sql文本是怎么样的.我用GORM没遇到这样的问题

3年前 评论

@snowlyg 笔误笔误,之前出BUG的代码是写的phone,已改为 phone ,刚测还是会有此BUG

3年前 评论

@hhiew 卧槽了,刚才加了debug()测试居然没有此BUG出现了,神奇。。。难道是我眼花了。。。

3年前 评论

代码和昨天一样,问题却复现不了了,算了,眼花了

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!