GORM 的介绍与实践 | 青训营

161 阅读5分钟

注:本篇文章将结合本人之前的学习经历进行描述,可能存在大量个人习惯,还请见谅,也欢迎提出见解!

ORM 框架

ORM(对象关系映射)框架是一种将对象模型与关系数据库之间进行转换的工具。它允许开发人员使用面向对象的方式来操作数据库,而无需直接编写SQL查询和处理数据库连接。

在 .NET 中,EFCore(Entity Framework)是官方ORM框架,它提供了LINQ(Language Integrated Query)查询语言以及一套丰富的API,用于轻松地进行数据库操作。EF支持自动迁移、关联关系、事务管理和性能优化等功能,并提供了代码优先(Code First 根据代码生成数据库)和数据库优先(DB First 根据数据库生成实体代码属性)两种开发模式。

初识 GORM

GORM(Go ORM)是一款流行的Go语言对象关系映射(ORM)库,它提供了对各种关系型数据库的支持,包括MySQL、PostgreSQL、SQLite等;

当使用Go语言开发Web应用时,与数据库的交互是常见的需求之一。为了简化数据库操作并提高代码复用性, GORM 便诞生了。

使用

  1. 安装和导入GORM

在开始之前,我们首先需要安装GORM。在终端中执行以下命令:

image.png

go get 表示获取外部包;等价于 .NET 中的从 Nuget 服务器上下载包:dotnet add package <PACKAGE_NAME>。

  1. 接下来,在Go代码中导入GORM和MySQL驱动:

image.png

  1. 连接数据库

在使用 GORM 之前,我们需要建立与数据库的连接。以 MySQL 为例,我们需要指定数据库的连接信息,包括主机地址、用户名、密码、数据库名称等:

image.png

此时db已经是一个可以使用的数据库连接对象

在上述代码中,我们通过 gorm.Open() 函数创建了与 MySQL 数据库的连接。需要替换 user 和 password 为自己的数据库用户名和密码。mydatabase 是要连接的数据库名称。

  1. 定义模型

在进行数据库操作之前,我们需要定义与数据库表对应的Go结构体,也称为模型。GORM将根据模型的定义来映射数据库表和记录。

image.png

在上述代码中,我们定义了一个名为User的结构体,它具有Name和Email两个字段。

其中,gorm.Model 是一个内嵌的结构体,它提供了一些公共字段(如ID、CreatedAt、UpdatedAt、DeletedAt)用于跟踪记录的创建时间、更新时间和软删除等。

  1. 增删改查操作

现在我们已经连接到数据库并定义了模型,可以进行常见的增删改查操作了。以下是一些示例代码:

  • 创建记录(Insert)

image.png

在上述代码中,我们创建了一个名为user的User对象,并使用Create()方法将其保存到数据库中。

  • 查询记录

image.png

在上述代码中,我们使用Find()方法查询所有的User记录,并将结果存储在users切片中。或者,如果只想查询单个记录,可以使用First()方法,并提供要查询的记录的条件(如ID)

实战

在“简易版抖音”项目中,我们团队也使用了这个框架。

首先在 dao 文件夹下有一个 connenct.go 文件:

image.png

其中定义了数据库的连接信息:

image.png

声明了一个全局变量 db,用于存储与数据库的连接。

在应用程序初始化时被调用。首先,定义了一个 DSN(数据源名称),其中包含了连接数据库所需的信息,如用户名、密码、主机和数据库名称等。然后,通过 gorm.Open() 函数创建与MySQL数据库的连接,并将其赋值给全局变量 db。如果连接过程中发生错误,会触发 panic 并输出错误信息。

接下来,通过 db.DB() 方法获取底层的 SQL 数据库连接对象,并对连接的生命周期、最大打开连接数和最大空闲连接数进行了设置。

最后,通过 db.AutoMigrate(&User{}) 语句进行自动迁移,创建或修改与 User 模型相对应的数据库表结构。

函数 GetDB(),用于返回全局的数据库连接对象 db。可以在其他地方调用该函数来获取已经建立好的数据库连接。

关于操作

image.png

第一个函数用于将用户对象插入到数据库中。首先,通过调用 GetDB() 函数获取数据库连接对象。然后,使用 Create() 方法将用户对象插入数据库。如果插入成功,则返回 nil;否则返回插入过程中的错误。

第二个函数用于按照用户 ID 查找用户,并返回查找结果和可能出现的错误。同样地,首先获取数据库连接对象。然后,使用 Where() 方法指定查询条件,使用 First() 方法执行查询,并将结果存储到 user 对象中。如果找到了匹配的用户,则返回 true 和 nil;如果未找到匹配的记录,则返回 false 和 nil;如果在查询过程中发生了其他错误,例如数据库连接失败或者语法错误,则返回 false 和相应的错误信息。

总结

总的来说,GORM是一个功能丰富、易用且具有强大性能的Go语言ORM框架。它提供了丰富的功能和灵活的API,使得与关系型数据库的交互变得更加简单和高效。无论是小型应用还是大型企业级项目,都可以从GORM的优势中受益并提升开发效率。