gorm查詢條件中帶有limit的同時查詢count總條數
1、場景
假設我需要查詢用戶表中年齡是18歲的用戶,且取第4-14條數據,則sql語句應為
SELECT * FROM `t_people` WHERE age = 18 ORDER BY username asc LIMIT 10 OFFSET 3
這時候我還需要拿一個沒有limit和offset條件的數量,即
SELECT count(*) FROM `t_people` WHERE age = 18 ORDER BY username asc
這時候用gorm可以這么寫
2、寫法
①正常的查詢代碼
這樣只能篩選出十條數據,而不能獲取到總數據條數
err := db.Model(&TPeople{}).Where("age = ?", 18).
Order("username asc").
Limit(10).
Offset(3).
Scan(&peoples).
Error
②通過給參數-1重置limit條件和offset條件,即可獲取總數據條數
err := db.Model(&TPeople{}).Where("age = ?", 18).
Order("username asc").
Limit(10).
Offset(3).
Scan(&peoples).
Limit(-1).
Offset(-1).
Count(&count).
Error
完整代碼請參考
創建表的sql語句
CREATE TABLE `t_people` (
`username` varchar(50) NOT NULL,
`sex` varbinary(100) NOT NULL,
`age` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
mysql.go文件
package mysqlManager
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type MysqlBase struct {
//用於連接數據庫
Host string `toml:"host"`
Port int `toml:"port"`
Db string `toml:"db"`
Username string `toml:"username"`
Password string `toml:"password"`
MaxConn int `toml:"maxConn"`
MaxIdle int `toml:"maxIdle"`
Timeout int `toml:"timeout"`
}
var ManagerMysql *mysqlManager
type mysqlManager struct {
//初始化數據庫,可初始化多個
Database1 *gorm.DB
Database2 *gorm.DB
Database3 *gorm.DB
}
func makePool(obj MysqlBase) *gorm.DB {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%ds",
obj.Username, obj.Password, obj.Host, obj.Port, obj.Db, obj.Timeout)
var db *gorm.DB
var err error
//打印SQL語句
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
if err != nil {
panic(fmt.Sprintf("connect mysql fail, error: %v", err))
}
sqlDB, err := db.DB()
if err != nil {
panic(fmt.Sprintf("make mysql pool fail, error:%v", err))
}
sqlDB.SetMaxOpenConns(obj.MaxConn)
sqlDB.SetMaxIdleConns(obj.MaxIdle)
return db
}
func init() {
database1 := makePool(MysqlBase{
Host: "127.0.0.1",
Port: 3306,
Db: "mydatabase",
Username: "root",
Password: "txh0916@TXH",
MaxConn: 10,
MaxIdle: 5,
Timeout: 60,
})
ManagerMysql = &mysqlManager{
Database1: database1,
}
}
test.go文件
package main
import (
"fmt"
mysqlManager "rainbow-tan.com/m/v1"
)
type TPeople struct {
Username string `gorm:"column:username" db:"username" json:"username" form:"username"`
Sex int64 `gorm:"column:sex" db:"sex" json:"sex" form:"sex"`
Age int64 `gorm:"column:age" db:"age" json:"age" form:"age"`
}
func (p TPeople) TableName() string {
return "t_people"
}
func main() {
var peoples []TPeople
var count int64
db := mysqlManager.ManagerMysql.Database1
err := db.Model(&TPeople{}).Where("age = ?", 18).
Order("username asc").
Limit(10).
Offset(3).
Scan(&peoples).
Limit(-1).
Offset(-1).
Count(&count).
Error
if err != nil {
fmt.Println(fmt.Sprintf("錯誤信息:%s", err))
return
}
fmt.Println(fmt.Sprintf("查詢到的條數:%d, %+v", len(peoples), peoples))
fmt.Println(fmt.Sprintf("總條數:%d", count))
}
參考 : https://www.yuedun.wang/blogdetail/5e815979c9109f0f909b4cdd/