当前位置: 首页 > 工具软件 > Go GORM > 使用案例 >

golang gorm 查询

叶越
2023-12-01

First

type Student1 struct {
	ID      int   `gorm:"primary_key"`
	Name  string  `gorm:"type:varchar(100)"`    // `这种是数据库的约束`
	Chinese   int
	English   int
	Math   int
}

func selects(db *gorm.DB)  {
	status := Student1{}

	//在数据库中查询数据, 将查询出来的第一个数据塞到status 结构体中, 因为结构体传参的时候不会修改原结构体内的数据, 所以要进行指针传递,  也是因为First要求接收指针的
	db.First(&status)
	fmt.Println(users)

}

Find 获取多个数据

当我们要获取多个数据的时候, 需要用到切片进行接收多条数据, 如:

func selects(db *gorm.DB)  {
	var users []Student1
	
	// 将查询出来的数据放到切片中
	db.Find(&users)
	
	fmt.Println(users)
	for i, j := range users{
		fmt.Println(i, j)
	}
}

Where 条件查询

func selects(db *gorm.DB)  {
	var users []Student1
	
	// 获取数据库中所有叫张小明的数据
	db.Where(Student(Name: "张小明").Find(&users)
	
	fmt.Println(users)
	for i, j := range users{
		fmt.Println(i, j)
	}
}

比较符 > = <

在gorm中是可以像sql语句一样的比较符查询的, 如:

func selects(db *gorm.DB)  {
	status := Student1{}
	var users []Student1

	//data := db.First(&status)
	//在数据库中查询数据, 将数据塞到status 结构体中
	db.First(&status)
	//db.Where("Math > ?", 90).Find(&users)
	//db.Where("Math < ?", 90).Find(&users)
	//db.Where("Math = ?", 90).Find(&users)
	//db.Where("Math >= ?", 90).Find(&users)
	//db.Where("Math <> ?", 90).Find(&users)
	db.Where("Math <= ?", 90).Find(&users)

	fmt.Println(users)
	for i, j := range users{
		fmt.Println(i, j)

	}
}

主要用 ? 来占位, 也可以将查询条件写死在where中,

非连续查询

func selects(db *gorm.DB)  {
	status := Student1{}
	var users []Student1

	//data := db.First(&status)
	//在数据库中查询数据, 将数据塞到status 结构体中
	db.First(&status)

	db.Where("Math in (?)", []int{80,90}).Find(&users)

	fmt.Println(users)
	for i, j := range users{
		fmt.Println(i, j)

	}
}

这样就可以实现sql语句中的 in 非连续查询了

连续查询

func selects(db *gorm.DB)  {
	status := Student1{}
	var users []Student1

	//data := db.First(&status)
	//在数据库中查询数据, 将数据塞到status 结构体中
	db.First(&status)
	// 可以通过and 和 比较运算符来进行连续查询, 也可以通过 BETWEEN 来
	db.Where("Math > ? AND Math < ?", 10,80).Find(&users)
	
	// db.Where("Math BETWEEN ? AND ?", 10,80).Find(&users)
	fmt.Println(users)
	for i, j := range users{
		fmt.Println(i, j)

	}
}

分页 Offset + Limit

Offset 是跳过多少条数据, Limit 是查询多少条数据, 加起来就可以实现 分页功能, 如:

func selects(db *gorm.DB)  {
	status := Student1{}
	var users []Student1

	//data := db.First(&status)
	//在数据库中查询数据, 将数据塞到status 结构体中
	db.First(&status)
	offset := 2    // 从第几个开始查, 和limit 配合在一起可以实现分页功能
	limit := 5   // 要查多少个数据
	//db.Where("Math in (?) ", []int{10,20,30,90,80}).Find(&users)
	db.Offset((offset-1) * limit).Limit(limit).Find(&users)

	fmt.Println(users)
	for i, j := range users{
		fmt.Println(i, j)

	}
}

因为Offset 是跳过数据的, 所以要-1, 不然要查第一页, 写Offset = 1 的时候会跳过第一页
Offset * Limit ,就跳过的要查询的数据了

 类似资料: