这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
Gorm 是 Go 语言中一款开源的 ORM 框架,支持多种数据库,提供了易于使用的 API,被广泛应用于 Go 语言的 Web 开发中。
下方使用 result.Error 检查操作是否有错误,如果有错误则使用 panic 函数将错误信息抛出,终止程序的执行。
panic
函数用于停止程序的执行并抛出一个错误,该函数通常用于处理程序无法继续执行的严重错误。在这个例子中,如果出现错误,程序无法继续正常执行,我们使用 panic
函数抛出错误,中止程序的执行。
安装
go get -u gorm.io/gorm
连接数据库
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
dsn := "root:123456@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
Model定义
type User struct {
gorm.Model
Name string
Age int
}
创建数据
user := User{Name: "siyi", Age: 21}
result := db.Create(&user)
if result.Error != nil {
panic(result.Error)
}
获取一条数据
var user User
result := db.First(&user, 1) // 根据主键查询记录
if result.Error != nil {
panic(result.Error)
}
更新数据
result := db.Model(&user).Update("siyi", 20) // 更新记录
if result.Error != nil {
panic(result.Error)
}
删除数据
result := db.Delete(&user) // 删除记录
if result.Error != nil {
panic(result.Error)
}
条件查询
var users []User
result := db.Where("name = ?", "siyi").Find(&users) // 查询条件
if result.Error != nil {
panic(result.Error)
}
排序
var users []User
result := db.Order("age desc").Find(&users) // 排序
if result.Error != nil {
panic(result.Error)
}
分页
var users []User
result := db.Limit(10).Offset(20).Find(&users) // 分页
if result.Error != nil {
panic(result.Error)
}
多表联查
type User struct {
ID uint
Name string
Email string
Articles []Article
}
type Article struct {
ID uint
Title string
Content string
UserID uint
}
var users []User
db.Preload("Articles").Find(&users)
preload方法先把每一个用户对应的文章存到Articles字段中,再通过Find方法返回所有用户
综合应用
// 假设我们有两个模型:Product 和 Category,每个产品都属于一个分类
type Product struct {
gorm.Model
Name string
Description string
Price float64
CategoryID uint
Category Category
}
type Category struct {
gorm.Model
Name string
Products []Product
}
// 查询所有产品并按照价格从低到高排序,每页返回 10 个产品
func QueryProducts(pageNum int) ([]Product, error) {
var products []Product
err := db.Preload("Category").Order("price asc").Offset((pageNum - 1) * 10).Limit(10).Find(&products).Error
if err != nil {
return nil, err
}
return products, nil
}
// 查询某个分类下的产品,并按照价格从高到低排序,每页返回 20 个产品
func QueryProductsByCategory(categoryID uint, pageNum int) ([]Product, error) {
var products []Product
err := db.Preload("Category").Order("price desc").Where("category_id = ?", categoryID).Offset((pageNum - 1) * 20).Limit(20).Find(&products).Error
if err != nil {
return nil, err
}
return products, nil
}
Preload
方法用于预加载相关联的数据,这里我们预加载了Category
模型。Order
方法用于指定排序规则,这里我们按照Price
字段进行排序。Where
方法用于指定查询条件,这里我们查询了CategoryID
等于指定值的产品。Offset
和Limit
方法用于分页查询,这里我们每页返回 10 或 20 条数据。