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没遇到这样的问题