sqlx库的表单分页的两种方式

2023年 12月 15日 87.7k 0

sqlx的分页的两种方式

  • 第一种

通过limit,offset来做分页。这种方式的好处在于简单。如果数据量比较大,效率并不高。

    page := 1
    limit := 20
    startSet := (page - 1) * limit

语句如下:

    query, args, err := sqlx.Named("select id,user_id,username,password,email,gender,create_time,update_time from user where id >:id order by id  limit:limit offset:offset", map[string]interface{}{
        "id":     1,
        "limit":  limit,
        "offset": startSet,
    })
    query, args, err = sqlx.In(query, args...)
    query = db.Rebind(query)
    err = db.Select(&users, query, args...)
    fmt.Printf("users:%#v\n", users)    
  • 第二种

将从前端传来的页码和每页分页的值作为limit和id。将前端页面分页的数值通过点击传递到后端作为分页的值。只获取id开始到limit长度的数据。

如果前端传递来的limit=10, page传递过来的必然是1-x,那么计算结果如下

limit=10
page=1
page*limit-limit

1*10-10=0
2*10-10=10
3*10-10=20
4*10-10=30
5*10-10=40
6*10-10=50
7*10-10=60

如果传递来的limit是15,page传递过来的必然是1-x,那么结算结果如下

limit=15
page=1
page*limit-limit

1*15-15=0
2*15-15=15
3*15-15=30
4*15-15=45
5*15-15=60
6*15-15=75
7*15-15=90

如果要从1开始获取,那么page如果等于1,每次减去一个limit,并且查询的条件也是limit即可

limit := 10
page: = page*limit - limit

page为页码,limit默认为10,作为每页显示多少

var users []UserList
    query, args, err := sqlx.Named("select id,user_id,username,password,email,gender,create_time,update_time from user where id >:id order by id  limit:limit", map[string]interface{}{
        "id":    page,
        "limit": limit,
    })
    fmt.Println(page, limit)
    if err != nil {
        fmt.Printf("(sqlx.In) query failed, err: %v\n", err)
        // return
    }
    fmt.Println(query, args, err)
    query, args, err = sqlx.In(query, args...)

    // sqlx.In 返回带 `?` bindvar的查询语句, 我们使用Rebind()重新绑定它

    query = db.Rebind(query)
    // fmt.Printf("users:%#v\n", query)
    err = db.Select(&users, query, args...)

最后补充一个count

func userCount() (num int, err error) {
    sqlStr := `select count(id) from user`
    var count int
    err = db.Get(&count, sqlStr)
    if err != nil {
        // 查询数据库失败
        return 0, err
    }
    return count, err
}
type UserList struct {
    ID          int    `db:"id"`
    UserId      int    `db:"user_id"`
    Username    string `db:"username"`
    Password    string `db:"password"`
    Email       string `db:"email"`
    Gender      int    `db:"gender"`
    CreatedTime string `db:"create_time"`
    UpdatedTime string `db:"update_time"`
}
type ListCont struct {
    Items []UserList `json:"items"`
    Total int        `json:"total"`
}

func a2() (*ListCont, error) {
    limit := 10
    page: = page*limit - limit
    var users []UserList
    query, args, err := sqlx.Named("select id,user_id,username,password,email,gender,create_time,update_time from user where id >:id order by id  limit:limit", map[string]interface{}{
        "id":    page,
        "limit": limit,
    })
    fmt.Println(page, limit)
    if err != nil {
        fmt.Printf("(sqlx.In) query failed, err: %v\n", err)
        // return
    }
    fmt.Println(query, args, err)
    query, args, err = sqlx.In(query, args...)

    query = db.Rebind(query)
    err = db.Select(&users, query, args...)
    total, err := userCount()
    if err != nil {
        fmt.Println("err:", err)
    }
    return &ListCont{
        Items: users,
        Total: total,
    }, nil
}

那如果要传递一个参数,语句就变成了这样

select*from user where concat(username,email,user_id) like '%%' and id >0 limit 10;

参考:https://github.com/jmoiron/sqlx/issues/695https://github.com/jmoiron/sqlx/issues/860

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论