目录
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)库,它允许开发者以更简洁的方式操作数据库。
-
db.Where("age > ?", 18).Find(&users)
:这行代码表示从数据库中查找年龄大于18的用户,并将结果存储在users
切片中。?
是一个占位符,它将被后面的参数(这里是18)替换。 -
db.Not("age = ?", 18).Find(&users)
:这行代码表示从数据库中查找年龄不等于18的用户,并将结果存储在users
切片中。Not
方法用于添加一个否定条件,即排除满足指定条件的记录。 -
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)库,它允许开发者以更简洁的方式操作数据库。
-
db.FirstOrInit(&user, User{Name: "Alice"})
:这行代码表示从数据库中查找第一个名字为"Alice"的用户,并将结果存储在user
变量中。如果不存在这样的用户,则将user
初始化为一个新的User
实例,其Name
字段设置为"Alice"。 -
db.Attrs(User{Name: "Bob"}).First(&user)
:这行代码表示从数据库中查找第一个满足条件的记录,并将其赋值给user
变量。条件是通过Attrs
方法指定的,即Name
字段等于"Bob"。 -
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)库,它允许开发者以更简洁的方式操作数据库。
-
db.Where("age = (?)", db.Table("users").Select("MAX(age)")).Find(&users)
:这行代码表示从数据库中查找年龄等于最大年龄的用户,并将结果存储在users
切片中。子查询通过db.Table("users").Select("MAX(age)")
实现,返回最大的年龄值。 -
db.Select("name, age").Find(&users)
:这行代码表示从数据库中选择name
和age
字段,并将结果存储在users
切片中。 -
db.Order("age desc").Find(&users)
:这行代码表示按照年龄降序排列用户,并将结果存储在users
切片中。 -
db.Limit(10).Find(&users)
:这行代码表示限制查询结果为最多10条记录,并将结果存储在users
切片中。 -
db.Offset(20).Find(&users)
:这行代码表示从第21条记录开始查询,并将结果存储在users
切片中。 -
var count int64; db.Model(&User{}).Count(&count)
:这行代码表示计算User
表中的记录数,并将结果存储在count
变量中。 -
db.Group("age").Having("COUNT(*) > ?", 1).Find(&users)
:这行代码表示按年龄分组,并筛选出年龄组中有超过1个用户的组,然后将这些组中的用户信息存储在users
切片中。 -
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
切片中。 -
var ages []int; db.Pluck("age", &ages)
:这行代码表示仅提取age
字段的值,并将结果存储在ages
切片中。 -
var result []map[string]interface{}; db.Table("users").Select("name, age").Scan(&result)
:这行代码表示从users
表中选择name
和age
字段,并将结果扫描到一个包含字符串键和接口值的映射切片中。
链式操作
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框架,希望我们可以一起学习!