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