5.gorm基础新-单表高级查询

Where查询

直接写条件

var user UserModel
DB.Where("id = 5").Take(&user)
fmt.Println(user)

user = UserModel{}
DB.Where("id = 5 or age = 11").Take(&user)
fmt.Println(user)

注意where的顺序,再&函数的前面

结构体条件

  1. 非空字段查询
var user = UserModel{ID: 5, Name: "李四"}
DB.Debug().Where(user).Take(&user) 
// SELECT * FROM `user_models` WHERE (`user_models`.`id` = 5 AND `user_models`.`name` = '李四') AND `user_models`.`id` = 5IMIT 1
fmt.Println(user)

take、first、last只会查主键

Map条件

  1. 可以查空字段
var user UserModel
DB.Debug().Where(map[string]any{
  "age": 0,
}).Take(&user)
// SELECT * FROM `user_models` WHERE `age` = 0  LIMIT 1
fmt.Println(user)

嵌套where条件

query := DB.Where("age = ? and name = ?", 11, "王五1")

var user UserModel
DB.Debug().Where(query).Take(&user)
// SELECT * FROM `user_models` WHERE (age = 11 and name = '王五1') LIMIT 1
fmt.Println(user)

Or

或查询

var user UserModel
DB.Debug().Or("name = ?", "王五").Or("age = 12").Take(&user)
// SELECT * FROM `user_models` WHERE (name = '王五' OR age = 12) LIMIT 1
fmt.Println(user)

Not

非查询

var user UserModel
DB.Debug().Not("age = 12").Take(&user)
//  SELECT * FROM `user_models` WHERE NOT age = 12 LIMIT 1
fmt.Println(user)

排序

var userList []UserModel
// 降序
DB.Order("age desc").Find(&userList)
fmt.Println(userList)
// 升序
DB.Order("age asc").Find(&userList)
fmt.Println(userList)

Scan

只需要特定字段

  var nameList []string
  DB.Model(UserModel{}).Select("name").Scan(&nameList)
  fmt.Println(nameList)

或者可以直接使用Pluck

  var nameList []string
  DB.Model(UserModel{}).Pluck("name", &nameList)
  fmt.Println(nameList)

可以新建一个字段比较少的结构体

type User struct {
  Name string
  ID   int64
}

var users []User
DB.Model(UserModel{}).Scan(&users)
fmt.Println(users)

// 字段如果不对应
type Options struct {
  Label string `gorm:"column:name"`
  Value int64  `gorm:"column:id"`
}

var options []Options
DB.Model(UserModel{}).Scan(&options)
fmt.Println(options)

分组之后,需要特定字段的数据

  type User struct {
    Age   int
    Count int
  }
  var us []User

  DB.Model(UserModel{}).Group("age").Select("age, count(*) as count").Scan(&us)
  fmt.Println(us)


去重

  var nameList []string
  DB.Model(UserModel{}).Distinct("name").Select("name").Scan(&nameList)
  fmt.Println(nameList)

分页查询

  var users []UserModel
  // 第一页
  DB.Limit(10).Offset(0).Find(&users)
  fmt.Println(users)
  // 第二页
  DB.Limit(10).Offset(10).Find(&users)
  fmt.Println(users)
  // 第三页
  DB.Limit(10).Offset(20).Find(&users)
  fmt.Println(users)
  // 第n页

Scope

很多时候,我们会经常使用重复的查询方法

那么就可以把这些可能被复用的方法抽离出来

func Age18(tx *gorm.DB) *gorm.DB {
  return tx.Where("age >= ?", 18)
}

var users []UserModel
DB.Scopes(Age18).Find(&users)
fmt.Println(users)


还可以使用高阶函数的特点,实现带参数的scope

func NameIn(nameList ...string) func(tx *gorm.DB) *gorm.DB {
  return func(tx *gorm.DB) *gorm.DB {
    return tx.Where("name in  ?", nameList)
  }
}

var users []UserModel
DB.Scopes(NameIn("王五", "李四")).Find(&users)
fmt.Println(users)

查询钩子

func (u *UserModel) AfterFind(tx *gorm.DB) (err error) {
  fmt.Println("查询钩子")
  return
}

原生SQL

使用Row来进行查询操作

  var users []UserModel
  DB.Raw("select * from user_models where name = ?", "王五").Scan(&users)
  fmt.Println(users)

使用Exec来操作数据

DB.Exec("update user_models set name = ? where id = ?", "张三", 4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值