使用 GORM(Go 的 ORM 库)连接数据库,并完成数据持久层操作| 青训营

232 阅读6分钟

GORM简单上手指南

本文章为自己在基于课程视频时学习Gorm所得心得体会,本人拙见,若有不足之处,还请各位多多指出。

1、什么是gorm

Gorm 是针对 Go 语言的一款对象关系映射(ORM)库,用于在关系型数据库和编程语言对象之间建立映射关系,从而实现以面向对象的方式操作数据库,避免直接编写 SQL 查询语句。

主要特点

Gorm 提供了许多主要特点,以简化 Go 语言中的数据库操作:

  1. 模型定义: 开发者可以通过定义 Go 结构体来映射数据库表格。这使得可以指定字段的各种属性,如名称、数据类型、主键、索引等。

  2. 查询构建: Gorm 提供了丰富的查询构建方法,使得构造复杂的查询条件和排序规则变得轻松。这有助于减少手写 SQL 查询的工作量。

  3. 事务支持: Gorm 支持事务操作,确保数据库操作具有原子性和一致性。

  4. 预加载和延迟加载: 为了优化查询性能,Gorm 允许预加载相关联的数据。同时,延迟加载也受支持,以避免不必要的数据加载。

  5. 钩子函数: 开发者可以在模型的不同生命周期阶段注册回调函数,实现自定义的业务逻辑。

  6. 迁移工具: Gorm 提供了数据库迁移工具,自动同步数据库表结构和代码定义的模型。

  7. 插件扩展: Gorm 的功能可以通过插件进行扩展,例如添加缓存支持、审计日志等。

数据库后端支持

Gorm 支持多种数据库后端,包括但不限于:

  • MySQL
  • PostgreSQL
  • SQLite

示例

以下是一个简单的示例,展示了 Gorm 如何用于定义模型和执行查询操作:

import (
    "gorm.io/gorm"
    "gorm.io/driver/sqlite"
)

type User struct {
    gorm.Model
    Username string
    Email    string
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("Failed to connect to database")
    }
    
    // 自动迁移模型对应的表格
    db.AutoMigrate(&User{})
    
    // 创建新用户
    newUser := User{Username: "exampleuser", Email: "user@example.com"}
    db.Create(&newUser)
    
    // 查询用户
    var user User
    db.First(&user, 1) // 根据 ID 查询第一个用户
    
    // 更新用户信息
    db.Model(&user).Update("Email", "newemail@example.com")
    
    // 删除用户
    db.Delete(&user)
}

这就是用Gorm完成了一个简单的增删改查。

2、如何使用Gorm

2.1 下载gorm

最简单的方式就是直接使用命令下载安装Gorm

go get -u github.com/jinzhu/gorm

2.2 数据库连接

使用gorm连接数据库

package main
​
import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
​
func main() {
    dsn := "root:root@tcp(localhost:3306)/db1"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()
}

2.3 定义模型

在 Gorm 中,模型是通过结构体来定义的,每个结构体对应数据库中的一个表。 你可以使用结构体的字段来表示表中的列,进行映射。

type User struct {
    gorm.Model
    Username string
    Email    string
}

gorm.Model 是一个内置的 Gorm 模型,包含了常用的字段,如 ID、CreatedAt、UpdatedAt 和 DeletedAt,用于记录记录的创建时间、更新时间以及软删除的状态。

2.4 增加数据(创建)

使用 Gorm 创建新的数据库记录时,需要创建一个对应模型的实例,并将其传递给 Create 方法。

newUser := User{Username: "exampleuser", Email: "user@example.com"}
db.Create(&newUser)

这将在数据库中插入一个新的用户记录。

2.5 查询数据

Gorm 提供了丰富的查询方法,以适应不同的查询需求。以下是一些常见的查询操作示例:

  • 查询所有记录:
var users []User
db.Find(&users)
  • 根据主键查询单个记录:
var user User
db.First(&user, 1) // 查询 ID 为 1 的用户
  • 条件查询:
var user User
db.Where("username = ?", "exampleuser").First(&user)
  • 查询某个字段的最大值:
var maxID int64
db.Model(&User{}).Select("MAX(id)").Scan(&maxID)

2.6 更新数据

在 Gorm 中,更新数据包括更新单个字段、多个字段以及使用 Map 进行更新。

  • 更新单个字段:
db.Model(&user).Update("Email", "newemail@example.com")
  • 更新多个字段:
db.Model(&user).Updates(User{Username: "newusername", Email: "newemail@example.com"})
  • 使用 Map 进行更新:
db.Model(&user).Updates(map[string]interface{}{"Username": "newusername", "Email": "newemail@example.com"})

2.7 删除数据

当涉及删除数据时,Gorm提供了两种不同的删除方式:软删除和硬删除。这两种方式的区别在于数据是否在数据库中保留。

软删除

软删除是一种删除方式,其中记录会被标记为已删除,但实际上仍然保留在数据库中。Gorm通过在表中添加一个 DeletedAt 列来实现软删除。当你执行软删除时,Gorm会将该记录的 DeletedAt 列设置为当前的删除时间戳,表示该记录已被删除。

db.Delete(&user)

在上述示例中,user 记录将被软删除。这意味着 DeletedAt 列将被设置为当前的删除时间戳,而记录本身仍然存在于数据库中。你可以通过查询条件来找到已被软删除的记录,或者使用 Unscoped 方法来查看所有记录,包括被软删除的记录。

硬删除

硬删除是完全从数据库中删除记录的方式,没有保留记录的痕迹。在Gorm中,通过使用 Unscoped 方法可以执行硬删除。

db.Unscoped().Delete(&user)

在上述示例中,Unscoped 方法用于执行硬删除操作,该操作会永久删除数据库中的 user 记录,而不仅仅是将其标记为已删除。执行硬删除后,记录将不再存在于数据库中,无法恢复。

总之,软删除和硬删除是Gorm中删除数据的两种不同方式。软删除会将记录标记为已删除,但保留在数据库中,而硬删除则会永久从数据库中删除记录。你可以根据实际需求选择合适的删除方式。

2.8 事务支持

Gorm 支持事务操作,以确保一组操作要么全部成功,要么全部失败。事务通过 Begin 方法启动,然后通过 Commit 提交或 Rollback 回滚。

tx := db.Begin()
if tx.Error != nil {
    // 处理事务启动错误
}

// 在事务中执行数据库操作
if err := tx.Create(&newUser).Error; err != nil {
    tx.Rollback() // 操作失败,回滚事务
} else {
    tx.Commit() // 操作成功,提交事务
}

错误检查

大家应该发现了,在Gorm中,错误检查变得更加简单了

而我们错误检查一般使用:

if err := db.Way.Error; err != nil { 
   fmt.Println("操作失败", err) 
}

在 GORM 中,许多操作返回的结果是一个 *gorm.DB 类型的对象,该对象具有一个名为 Error 的字段,用于存储操作可能发生的错误。当操作出现错误时,这个 Error 字段会被设置为相应的错误值。 为了检查操作是否产生了错误,我们可以通过以下步骤进行:

使用 db.Error 来获取操作返回的错误。这会将 *gorm.DB 对象中的 Error 字段的值赋给变量 err。 检查 err 是否不等于 nil,即判断操作是否产生了错误。

总结

深入了解 Gorm 的增加、查询、更新和删除操作,以及事务支持和错误检查,将帮助你更好地管理数据库操作。在实际项目中,这些操作将成为你与数据库交互的基础,使你能够更有效地操作和维护数据。

参考文章:使用 GORM(Go 的 ORM 库)连接数据库,并完成数据持久层操作| 青训营 - 掘金 (juejin.cn)