前言
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结构体,同时定义了Code和Price字段。
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{})
上述代码中的 user、password、database 分别表示 MySQL 数据库的用户名、密码和数据库名。你需要将它们替换为实际的值。注意database需要已经存在,否则会报错。
为了避免潜在问题,记得在程序结束时显式地关闭数据库连接,即使用 db.Close() 方法来关闭连接。
执行 db.AutoMigrate(&Product{}) 后,GORM 会检查数据库中是否存在 products 表(根据模型名称的复数形式),如果不存在,则创建这个表,在MySQL Workbench中看到自动创建的表如图:
4. 增删改查
在建立起Product结构体与Product表之间的关联后,我们就可以利用GORM提供的各种API来进行数据库的增删改查等操作。以下是一些常见的操作示例:
增
首先,我们可以利用Create函数来为数据库表新增一条记录
product := Product{Code: "D42", Price: 100}
db.Create(&product)
执行代码后将在Product数据库表中创建一条具有指定字段值的新记录。
查
然后,我们可以使用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)
可以看到数据库表中对应的记录更改了:
删
最后,我们可以使用Delete来删除数据库表中的记录
db.Delete(&product, 1)
由于gorm.model中有deleted_at字段,将启用软删除,即当deleted_at中有记录则断定该条记录已删除。
(如果没有定义软删除,则数据库将把这条记录清除)