使用GORM操作MySQL | 青训营

87 阅读3分钟

前言

GORM(Go Object Relational Mapping) 是Go语言中一个流行的ORM(对象关系映射)库,用于处理Go语言对象和关系型数据库之间的映射。它提供了一种便捷的方式来操作数据库,使开发者能够更轻松地进行数据库的增删改查操作,同时封装了许多常见的数据库操作细节,使代码更加简洁、易读和可维护。

得益于GORM官网全面而详细的入门指南,在项目中引入GORM的门槛并不高。官网给出的例子是利用Go语言操作SQLite数据库。而我们小组在项目中选择的是MySQL数据库,因此本篇笔记将跟随官网的指引,在1024Code中示例如何使用GORM操作MySQL数据库。

快速入门

1. 导入依赖

第一步是引入所需的依赖库,我们需要导入用于MySQL数据库驱动的gorm.io/driver/mysq… 包以及GORM库的核心 gorm.io/gorm 包。

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

2. 定义数据模型

编写结构体Product,继承gorm.Model结构体,同时定义了CodePrice字段。

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

gorm.Model 是 GORM 提供的一个用于定义模型结构的辅助结构体,包括以下几个字段:

  • ID:模型的主键 ID。
  • CreatedAt:记录的创建时间。
  • UpdatedAt:记录的更新时间。
  • DeletedAt:记录的删除时间(如果启用了软删除)。

使用 gorm.Model 可以帮助你在创建数据库表时自动添加这些字段,以及在查询和操作时方便地使用它们。

3. 创建数据库连接,并根据结构体自动关联表

使用 GORM 创建一个数据库连接:

    dsn := "user:password@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 to database")
    }
    defer db.Close()
    db.AutoMigrate(&Product{})

上述代码中的 userpassworddatabase 分别表示 MySQL 数据库的用户名、密码和数据库名。你需要将它们替换为实际的值。注意database需要已经存在,否则会报错。

为了避免潜在问题,记得在程序结束时显式地关闭数据库连接,即使用 db.Close() 方法来关闭连接。

执行 db.AutoMigrate(&Product{}) 后,GORM 会检查数据库中是否存在 products 表(根据模型名称的复数形式),如果不存在,则创建这个表,在MySQL Workbench中看到自动创建的表如图:

image.png

4. 增删改查

在建立起Product结构体与Product表之间的关联后,我们就可以利用GORM提供的各种API来进行数据库的增删改查等操作。以下是一些常见的操作示例:

首先,我们可以利用Create函数来为数据库表新增一条记录

    product := Product{Code: "D42", Price: 100}
    db.Create(&product)

执行代码后将在Product数据库表中创建一条具有指定字段值的新记录。

image.png

然后,我们可以使用First函数来查看数据库表中的一条记录

    var product Product
    db.First(&product, 1) // 根据整型主键查找
    fmt.Println("Code:", product.Code)

    //var product Product
    //db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
    //fmt.Println("Code:", product.Code)

执行代码后将在控制台看到对应的输出。

之后,我们可以使用Update来更新数据库表中的记录

    db.Model(&product).Update("Price", 200)

可以看到数据库表中对应的记录更改了:

image.png

最后,我们可以使用Delete来删除数据库表中的记录

    db.Delete(&product, 1)

由于gorm.model中有deleted_at字段,将启用软删除,即当deleted_at中有记录则断定该条记录已删除。

image.png

(如果没有定义软删除,则数据库将把这条记录清除)