GORM入门实践 | 青训营
前言
GORM是Go语言中一个流行的对象关系映射(Object Relational Mapping,ORM)库。它提供了简单且易于使用的API,旨在简化数据库操作和管理。本文将从实践入手,练习GORM的基础使用。
学习框架最高效的办法就是阅读官方文档,官方文档通常提供了全面而详细的框架介绍、API参考、使用示例和最佳实践等内容,能够帮助开发者快速上手和深入了解框架的特性和用法。所以在接下来的实践中,本文将紧紧跟随官网的指引,快速上手GORM。
快速入门
在官网的快速入门中,给出了利用Go语言操作SQLite数据库的例子。
开始看到这个例子时我感觉有点懵,通过后续查找资料我才了解到,SQLite是一种轻量级的嵌入式数据库引擎,它不需要独立的服务器进程或配置。这使得用SQLite作为示例数据库非常方便,因为它只是一个文件,无需额外的设置和安装。
我猜,正是由于SQLite轻量级、跨平台、简单易用的特点,所以才作为了GORM官方文档的第一个快速入门案例。 接下来我将实践并介绍利用Go语言操作SQLite数据库的方法。
1. 导入依赖,定义数据模型
利用GORM操作SQLite数据库的第一步首先要引入相关的依赖包,也就是导入用于SQLite数据库驱动的gorm.io/driver/sqli… 包以及导入GORM库的核心 gorm.io/gorm 包。
然后编写结构体Product,继承gorm.Model结构体,同时定义了Code和Price字段。
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type Product struct {
gorm.Model
Code string
Price uint
}
2. 连接数据库,根据结构体自动建表
我们可以使用 gorm.Open(sqlite.Open("test.db"), &gorm.Config{})打开一个SQLite数据库连接,并将其与变量 db 关联起来,然后可以利用 err 变量接收错误信息,如果err的值不为nil,则说明连接出错,使用panic函数及时终止程序执行。
Gorm 支持 Migration特性,支持根据Go Struct 结构自动生成对应的表结构。我们可以调用db.AutoMigrate(&Product{})函数自动创建Product表。
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
db.AutoMigrate(&Product{})
3. 进行数据库的增删改查
在建立起Product结构体与Product表之间的关联后,我们就可以利用GORM提供的各种API来进行数据库的增删改查等操作。
首先,我们可以利用Create函数来为数据库表新增一条记录,例如db.Create(&Product{Code: "D42", Price: 100}),等价于SQL语句INSERT INTO products (code, price) VALUES ('D42', 100);,这样将在Product数据库表中创建一条具有指定字段值的新记录。
然后,我们可以使用First函数来查看数据库表中的一条记录,例如db.First(&product, 1)可以查找主键为1的一条记录,等价的SQL语句为SELECT * FROM products WHERE id = 1 LIMIT 1;,也可以使用db.First(&product, "code = ?", "D42"):查找 code 字段值为 D42 的记录,等价的 SQL 语句为:SELECT * FROM products WHERE code = 'D42' LIMIT 1;。备注:如果想要查找符合条件的多条记录,需要使用Find函数,如果有复杂的条件,可以使用Where函数进行过滤,注意Where函数并不执行SQL,只有Create、First、Find、Update、Delete等函数才会有真正SQL语句的执行。
之后,我们可以使用Update来更新数据库表中的记录,但是首先要使用Model函数来指定设置要操作的模型对象,通过将模型对象(例如 &product)传递给 Model 函数,才能确定要操作的表以及与之关联的模型结构。然后就可以链式调用Update函数来更新信息。备注:Update中如果参数为结构体,则只能更新非零值,我们可以通过设置参数为map就可以解决这一问题。
最后,我们可以使用Delete来删除数据库表中的记录,例如我们可以使用db.Delete(&product, 1)删除数据库表中主键为1的字段,等价与SQL语句DELETE FROM products WHERE id = 1;。
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - 删除 product
db.Delete(&product, 1)
当然,上述方法也基本适用于操作MySQL数据库,但是由于时间有限,就不再此说明,在后续的文章中我会进行更加详细的介绍。
总结
GORM 是 Go 语言中流行的对象关系映射(ORM)库,它提供了简单易用的 API,用于简化数据库操作和管理。通过官方的快速入门,基本掌握了利用Go语言操作SQLite数据库的方法:首先导入依赖,定义数据模型,然后连接数据库,调用AutoMigrate根据结构体自动建表,最后就可以进行愉快的增删改查操作了。
当然,上述内容仅仅是快速开始的内容,在后续的文章中,我会进行更加详细的介绍,希望能够充分学习GORM框架的基本内容和高阶特性。

