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)
}
当我们要获取多个数据的时候, 需要用到切片进行接收多条数据, 如:
func selects(db *gorm.DB) {
var users []Student1
// 将查询出来的数据放到切片中
db.Find(&users)
fmt.Println(users)
for i, j := range users{
fmt.Println(i, j)
}
}
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 是查询多少条数据, 加起来就可以实现 分页功能, 如:
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 ,就跳过的要查询的数据了