Grom使用 | 青训营笔记

122 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 等于指定值的产品。
  • OffsetLimit 方法用于分页查询,这里我们每页返回 10 或 20 条数据。