使用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)
### GORM 使用指南与示例代码解析 #### 1. **GORM 基础概念** GORM 是一款专为 Go 语言设计的强大 ORM 框架,提供全功能的 ORM 支持,包括关联关系、事务处理、嵌套事务等特性[^2]。它的目标是成为开发者友好的工具库,帮助简化数据库交互过程。 --- #### 2. **安装 GORM** 在使用 GORM 之前,需要先通过 `go get` 安装依赖包: ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite # SQLite 驱动为例 ``` --- #### 3. **初始化 GORM 实例** 以下是一个完整的 GORM 初始化流程,展示了如何连接数据库并创建模型实例[^4]: ```go package main import ( "fmt" "gorm.io/driver/sqlite" "gorm.io/gorm" ) // 定义模型结构体 type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"size:255"` Email string `gorm:"uniqueIndex;size:255"` CreatedAt time.Time } func main() { // 连接 SQLite 数据库 db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") } // 自动迁移模式 err = db.AutoMigrate(&User{}) if err != nil { fmt.Println(err) return } // 创建记录 user := User{Name: "Alice", Email: "[email protected]"} result := db.Create(&user) if result.Error != nil { fmt.Println(result.Error) } else { fmt.Printf("Created user with ID %d\n", user.ID) } // 查询第一条记录 var firstUser User db.First(&firstUser) fmt.Printf("First user's name is %s\n", firstUser.Name) } ``` --- #### 4. **常用操作** ##### (a) **创建记录** 可以通过 `Create()` 方法向数据库中插入一条新记录[^4]: ```go db.Create(&User{Name: "Bob", Email: "[email protected]"}) ``` ##### (b) **查询记录** 利用 `First()` 或者其他条件查询方法获取指定记录[^4]: ```go var user User db.Where("name = ?", "Alice").First(&user) fmt.Println(user.Email) ``` ##### (c) **更新记录** 支持多种方式更新已有数据[^2]: ```go db.Model(&user).Update("Name", "Charlie") ``` ##### (d) **删除记录** 通过主键或其他唯一字段删除对应的数据项[^2]: ```go db.Delete(&User{}, user.ID) ``` --- #### 5. **高级特性** ##### (a) **分表插件** 对于大规模数据存储需求,可以借助 GORM 的分表插件实现水平扩展[^1]。例如,在初始化过程中加入分表逻辑: ```go plugin := sharding.NewPlugin( sharding.WithKeyFunc(func(model interface{}) string { u := model.(*User) return strconv.Itoa(int(u.ID%10)) // 简单取模算法 }), ) db.Use(plugin) ``` ##### (b) **ClickHouse 插件** 针对特殊场景(如 OLAP 分析),可引入 ClickHouse 插件以增强性能[^3]: ```go type Event struct { Timestamp time.Time `gorm:"column:timestamp"` Value float64 `gorm:"column:value"` } db.Table("events").Create(&Event{Timestamp: time.Now(), Value: 123.45}) ``` --- #### 6. **文档资源** 官方文档提供了详尽的功能说明和技术细节,建议深入阅读以便更好地掌握 GORM 的强大功能: - [GORM 官方文档](https://gorm.io/zh_CN/docs/) - [GitHub 地址](https://github.com/go-gorm/gorm) ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值