使用gorm进行数量统计

使用count方法

表结构模型

type Menu struct {
	gorm.Model
	Name      string    `gorm:"column:name"`
	Order	  string    `gorm:"column:order"`
}

查询示例

var menusCount int64
global.DB.Model(&Menu{}).Count(&menusCount)
// SELECT count(*) FROM "sys_app_menu" WHERE "sys_app_menu"."deleted_at" IS NULL
、、

可以看到,sql自动增加了查询条件 WHERE "sys_app_menu"."deleted_at" IS NULL。如果不想要这段内容,可以这样写

var menusCount int64
global.DB.Model(&Menu{}).Unscoped().Count(&menusCount)
// SELECT count(*) FROM "sys_app_menu"

此外,使用find、scan方法也可以实现相同的效果

//表结构模型
type AuthorityMenu struct {
	AuthorityId string `gorm:"column:authority_id;"`
	MenuID      uint   `gorm:"column:menu_id;"`
}

//使用Find方法进行统计
var adminMenusCount int64
global.DB.Model(&AuthorityMenu{}).Select("count(1)").Where("authority_id = '001'").Find(&adminMenusCount)
// SELECT count(1) FROM "authority_menu" WHERE authority_id = '0001'

//使用Scan方法进行统计
var adminMenusCount int64
global.DB.Model(&AuthorityMenu{}).Select("count(1)").Where("authority_id = '001'").Scan(&adminMenusCount)
// SELECT count(1) FROM "authority_menu" WHERE authority_id = '0001'

链式查询(复用查询条件)

查询示例如下:

var menuIds []uint
var menusCount int64
global.DB.Model(&AppMenu{}).Select("id").Find(&menuIds).Count(&menusCount)
// SELECT "id" FROM "sys_app_menu" WHERE "sys_app_menu"."deleted_at" IS NULL
// SELECT COUNT("id") FROM "sys_app_menu" WHERE "sys_app_menu"."deleted_at" IS NULL

分组查询和统计

//查询不同性别的人数
var staticGrade =[]struct{
	Grade	  string    `gorm:column:grade"`
	Number    string    `gorm:column:number"`
}{}
global.DB.Model(&AppMenu{}).Select("count(id) AS number ,grade").Group("grade").Find(&staticGrade)

limit、offset对count的统计的影响

错误示例1:请注意,如下例子中,Count放在了最后面,查询时,count方法也会加上Limit和offset这两个语句:

global.DB.Limit(10).Offset(2).Find(&users).Count(&total)

错误示例2:
下面这种方法,看似没啥问题,实际上count的时候也会带上分页。

var orm=global.DB.Where("id =1")
orm.Limit(10).Offset(2).Find(&users)
orm.Count(&total)

正确用法是,先count,然后再分页和find

global.DB.Count(&total).Limit(10).Offset(2).Find(&users)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,你想了解在 Gin 框架中如何使用 GORM 吗? 首先,你需要在你的项目中导入 Gin 和 GORM 的依赖。在导入之后,你可以在你的代码中创建一个 GORM 的数据库实例,然后使用它来执行数据库的操作。 以下是一个示例代码片段,展示了如何在 Gin 中使用 GORM: ```go import ( "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { // 创建数据库连接 dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } // 将数据库实例作为 Gin 的中间件 r := gin.Default() r.Use(func(c *gin.Context) { c.Set("db", db) c.Next() }) // 在路由处理函数中使用数据库 r.GET("/users", func(c *gin.Context) { var users []User result := db.Find(&users) if result.Error != nil { c.JSON(500, gin.H{"error": "failed to get users"}) return } c.JSON(200, users) }) // 启动 Gin 服务器 r.Run(":8080") } ``` 在上面的代码中,我们创建了一个 GORM 的数据库实例,并将其作为 Gin 的中间件,使得在路由处理函数中可以直接使用该数据库实例来进行数据库的操作。在示例代码中,我们定义了一个 `/users` 的路由,当接收到 GET 请求时,会使用 GORM 查询数据库中的所有用户,并将结果以 JSON 格式返回给客户端。 希望这个例子可以帮助你理解在 Gin 中如何使用 GORM

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值