Bootstrap

go语言Gin框架的学习路线(十)

目录

GORM的CRUD教程

查询

普通查询

定义 User 结构体

查询所有用户

查询第一个用户

总结

条件查询

内联条件

额外查询选项

高级查询

链式操作

Scopes

多个立即执行方法


GORM的CRUD教程

CRUD 是 "Create, Read, Update, Delete"(创建、查询、更新、删除)的缩写,代表了数据库操作的基本功能。在 GORM 的上下文中,CRUD 指的是使用 GORM 库来执行这些基本的数据库操作。

查询

以下是 GORM 进行不同查询操作的一些示例代码,包括普通查询、条件查询、高级查询等

普通查询

// 假设我们有一个User结构体
type User struct {
    gorm.Model
    Name string
    Age  int
}

// 查询所有用户
var users []User
db.Find(&users)

// 查询第一个用户
var firstUser User
db.First(&firstUser)

定义 User 结构体

首先定义了一个 User 结构体,它将映射到数据库中的一个表。gorm.Model 是 GORM 内置的,它包含了一些基本的字段,如 ID(主键)、CreatedAt(记录创建时间)、UpdatedAt(记录更新时间)和 DeletedAt(软删除时间)。

查询所有用户

使用 db.Find(&users) 方法来查询数据库中所有的 User 记录。

  • db 是一个 *gorm.DB 类型的变量,它代表了数据库的连接。
  • Find 方法用于检索数据库中的记录。
  • &users 是一个指向 User 类型切片的指针。GORM 会将查询到的所有用户记录填充到这个切片中。

查询第一个用户

使用 db.First(&firstUser) 方法来查询数据库中的第一个 User 记录。

  • First 方法用于检索数据库中的第一个记录。
  • &firstUser 是一个指向 User 结构体的指针。GORM 会将查询到的第一个用户记录填充到这个结构体中。

总结

这段代码演示了如何使用 GORM 来执行基本的数据库查询操作。Find 方法用于获取所有记录,而 First 方法用于获取第一个记录。在实际开发中,还需要考虑错误处理和可能的空值检查。

条件查询

// 使用Where查询
var users []User
db.Where("age > ?", 18).Find(&users) // 年龄大于18的用户

// 使用Not条件
db.Not("age = ?", 18).Find(&users) // 年龄不等于18的用户

// 使用Or条件
db.Where("age > ?", 18).Or("name = ?", "Alice").Find(&users) // 年龄大于18或名字为Alice的用户

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

  1. db.Where("age > ?", 18).Find(&users):这行代码表示从数据库中查找年龄大于18的用户,并将结果存储在users切片中。?是一个占位符,它将被后面的参数(这里是18)替换。

  2. db.Not("age = ?", 18).Find(&users)这行代码表示从数据库中查找年龄不等于18的用户,并将结果存储在users切片中。Not方法用于添加一个否定条件,即排除满足指定条件的记录。

  3. db.Where("age > ?", 18).Or("name = ?", "Alice").Find(&users):这行代码表示从数据库中查找年龄大于18或者名字为"Alice"的用户,并将结果存储在users切片中。Or方法用于添加一个或条件,即满足任一条件的记录都会被选中。

注意:在实际使用中,你需要确保已经正确配置了数据库连接,并且User结构体与数据库中的表结构相匹配。

内联条件

// 内联条件
db.Where("age > ? AND name = ?", 18, "Alice").Find(&users)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

db.Where("age > ? AND name = ?", 18, "Alice").Find(&users):这行代码表示从数据库中查找年龄大于18且名字为"Alice"的用户,并将结果存储在users切片中。?是一个占位符,它将被后面的参数(这里是18和"Alice")替换。

在这个例子中,Where方法用于添加一个条件,即年龄大于18且名字等于"Alice"。AND关键字用于连接两个条件,确保同时满足这两个条件的记录才会被选中。Find方法用于执行查询并将结果填充到指定的变量(这里是users切片)。

 

额外查询选项

// FirstOrInit
var user User
db.FirstOrInit(&user, User{Name: "Alice"}) // 如果不存在则初始化

// Attrs
db.First(&user, "id = ?", 1)
db.Attrs(User{Name: "Bob"}).First(&user) // 将参数赋值给user

// FirstOrCreate
db.FirstOrCreate(&user, User{Name: "Alice"}) // 如果不存在则创建

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

  1. db.FirstOrInit(&user, User{Name: "Alice"})这行代码表示从数据库中查找第一个名字为"Alice"的用户,并将结果存储在user变量中。如果不存在这样的用户,则将user初始化为一个新的User实例,其Name字段设置为"Alice"。

  2. db.Attrs(User{Name: "Bob"}).First(&user)这行代码表示从数据库中查找第一个满足条件的记录,并将其赋值给user变量。条件是通过Attrs方法指定的,即Name字段等于"Bob"。

  3. db.FirstOrCreate(&user, User{Name: "Alice"})这行代码表示从数据库中查找第一个名字为"Alice"的用户,并将结果存储在user变量中。如果不存在这样的用户,则创建一个新的用户,其Name字段设置为"Alice",并将新创建的用户赋值给user变量。

 

高级查询

// 子查询
var users []User
db.Where("age = (?)", db.Table("users").Select("MAX(age)")).Find(&users)

// Select
db.Select("name, age").Find(&users) // 只选择name和age字段

// Order
db.Order("age desc").Find(&users) // 按年龄降序

// Limit
db.Limit(10).Find(&users) // 限制结果为10条

// Offset
db.Offset(20).Find(&users) // 从第21条记录开始

// Count
var count int64
db.Model(&User{}).Count(&count)

// Group & Having
db.Group("age").Having("COUNT(*) > ?", 1).Find(&users)

// Joins
db.Table("users as u join profiles as p on u.id = p.user_id").Select("u.*, p.data").Scan(&users)

// Pluck
var ages []int
db.Pluck("age", &ages)

// Scan
var result []map[string]interface{}
db.Table("users").Select("name, age").Scan(&result)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

  1. db.Where("age = (?)", db.Table("users").Select("MAX(age)")).Find(&users)这行代码表示从数据库中查找年龄等于最大年龄的用户,并将结果存储在users切片中。子查询通过db.Table("users").Select("MAX(age)")实现,返回最大的年龄值。

  2. db.Select("name, age").Find(&users)这行代码表示从数据库中选择nameage字段,并将结果存储在users切片中。

  3. db.Order("age desc").Find(&users):这行代码表示按照年龄降序排列用户,并将结果存储在users切片中。

  4. db.Limit(10).Find(&users):这行代码表示限制查询结果为最多10条记录,并将结果存储在users切片中。

  5. db.Offset(20).Find(&users):这行代码表示从第21条记录开始查询,并将结果存储在users切片中。

  6. var count int64; db.Model(&User{}).Count(&count):这行代码表示计算User表中的记录数,并将结果存储在count变量中。

  7. db.Group("age").Having("COUNT(*) > ?", 1).Find(&users):这行代码表示按年龄分组,并筛选出年龄组中有超过1个用户的组,然后将这些组中的用户信息存储在users切片中。

  8. db.Table("users as u join profiles as p on u.id = p.user_id").Select("u.*, p.data").Scan(&users)这行代码表示执行一个连接查询,users表和profiles表连接起来,选择所有users表的字段以及profiles表的data字段,并将结果扫描到users切片中。

  9. var ages []int; db.Pluck("age", &ages):这行代码表示仅提取age字段的值,并将结果存储在ages切片中。

  10. var result []map[string]interface{}; db.Table("users").Select("name, age").Scan(&result)这行代码表示从users表中选择nameage字段,并将结果扫描到一个包含字符串键和接口值的映射切片中。

 

链式操作

db.Where("age > ?", 18).Order("age desc").Limit(10).Find(&users)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

db.Where("age > ?", 18).Order("age desc").Limit(10).Find(&users):这行代码表示从数据库中查找年龄大于18的用户,并按照年龄降序排列,最后取前10条记录,并将结果存储在users切片中。

具体解释如下:

  • db.Where("age > ?", 18):这部分代码表示添加一个条件,即年龄大于18。?是一个占位符,它将被后面的参数(这里是18)替换。
  • Order("age desc"):这部分代码表示按照年龄字段降序排列结果。
  • Limit(10):这部分代码表示限制查询结果最多为10条记录。
  • Find(&users):这部分代码表示执行查询并将结果填充到指定的变量(这里是users切片)。

 

Scopes

// 定义一个Scope
func AgeAbove(age int) func(db *gorm.DB) *gorm.DB {
    return db.Where("age > ?", age)
}

// 使用Scope
db.Scopes(AgeAbove(18)).Find(&users)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

首先定义了一个名为AgeAbove的函数,该函数接受一个整数参数age,并返回一个闭包函数。这个闭包函数接受一个*gorm.DB类型的参数,表示一个GORM数据库连接实例,并返回一个同样类型的结果。在这个闭包函数中,使用了Where方法来添加一个条件,即年龄大于传入的age参数。

接下来,在调用db.Scopes(AgeAbove(18)).Find(&users)时,使用了Scopes方法来应用AgeAbove函数定义的条件。这里的AgeAbove(18)表示创建一个只查询年龄大于18岁的用户的条件。然后,通过链式调用Find方法来执行查询并将结果填充到users变量中。

总结一下,这段代码的作用是查询年龄大于18岁的用户,并将结果存储在users变量中。

 

多个立即执行方法

db.Where("age > ?", 18).Find(&users).Count(&count)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

db.Where("age > ?", 18).Find(&users):这部分代码表示添加一个条件,即年龄大于18岁,并执行查询将结果填充到users变量中。&users表示将查询结果存储在users切片中。

Count(&count):这部分代码表示计算满足条件的记录数,并将结果存储在count变量中。&count表示将计数结果存储在count变量中。

总结一下,这段代码的作用是查询年龄大于18岁的用户,并将结果存储在users切片中,同时计算满足条件的记录数,并将结果存储在count变量中。

 

请注意,这些示例代码假设你已经配置了 GORM 并连接到了数据库。你需要根据实际的数据库类型和配置来设置连接参数。此外,错误处理在实际应用中非常重要,应该根据需要进行适当的错误处理。

 期末放假自学Gin框架,希望我们可以一起学习!

;