ORM介绍
在学习 Gorm 前,我们应该先了解什么是 ORM,ORM 叫做对象关系映射,英文全称:Object–relational mapping。我们常见的 ORM 框架有 Mybatis, MyBatis-Plus, Hibernate。
使用ORM的原因:
- ORM是一种用于在关系数据库和面向对象的编程语言堆之间转换数据的编程技术
- 通过ORM技术,我们可以将关系数据库中某个数据表的结构关联到某个类/结构体上,并通过修改类/结构体实例的方式轻易的完成数据库增删改查(CRUD)的任务
- 通过ORM技术,我们得以以一种更加友好且高效的方式,在尽量不接触 SQL 语句的情况下操作数据库
GROM
GORM 提供了许多功能和特性,包括:
- 模型定义:GORM 允许开发者通过定义结构体来表示数据库表,并可以通过在结构体中进行标记(tagging)来指定字段名称、数据类型、约束条件等。
- 数据库迁移:GORM 支持自动化数据库迁移,即根据模型定义自动生成数据库表,以及根据模型的更改自动更新数据库表结构。
- CRUD 操作:GORM 提供了简单易用的 API,可以进行常见的数据库操作,如创建(Create)、读取(Retrieve/Query)、更新(Update)、删除(Delete)等。
- 查询构建器:GORM 提供了强大的查询构建器,可以通过链式调用的方式构建复杂的查询语句,并支持条件筛选、排序、分页等功能。
- 关联关系:GORM 支持定义和处理数据库表之间的关联关系,如一对一、一对多、多对多等关系,在查询时可以方便地进行关联数据的加载。
- 事务支持:GORM 提供了事务管理的功能,可以确保一组数据库操作要么全部成功要么全部失败,从而保持数据的一致性。
GROM的使用
引包
连接 MySQL数据库,需要引入 gorm 和 mysql两个包:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
连接数据库
在代码中,我们首先需要配置数据库连接信息并建立连接。这里以 MySQL 数据库为例:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println("无法连接到数据库:", err)
return
}
sqlDB, err := db.DB()
defer sqlDB.Close()
// 后续数据库操作...
}
首先,mysql.Open
接收一个字符串 dsn
,DSN 全称 Data Source Name
,翻译过来叫数据库源名称。DSN 定义了一个数据库的连接信息,包含用户名、密码、数据库 IP、数据库端口、数据库字符集、数据库时区等信息。DSN 遵循特定格式:username:password@protocol(address)/dbname?param=value
通过 DSN 所包含的信息,MYSQL 驱动就能够知道以什么方式连接到 MySQL 数据库了。 mysql.Open
返回的正是一个 gorm.Dialector
对象,将其传递给 gorm.Open
方法后,我们将得到 *gorm.DB
对象,这个对象可以用来操作数据库。
定义模型结构
在 GORM 中,连接成功后,我们需要定义数据库表对应的模型结构体。以test表为例,表结构如下:
CREATE TABLE `test` (
`id` bigint(20) NOT NULL,
`name` varchar(5) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
于是我们对应可以定义struct结构如下:
type Test struct {
ID int64 `gorm:"type:bigint(20);column:id;primary_key"`
Name string `gorm:"type:varchar(5);column:name"`
Age int `gorm:"type:int(11);column:age"`
}
上述代码定义了一个 Test
结构体,它包含了 Id
、Name
、Age
三个字段,每个字段后面的 gorm 是结构标记,可以用于声明对应数据库字段的属性。
gorm模型支持的tags注意:
gorm支持一些常见的tags来自定义模型字段的扩展信息
结构体标记描述
- column 列明(默认是字段的蛇形小写)
- type 数据类型
- size 列长度
- PRIMARY_KEY 声明主键
- UNIQUE 声明唯一
- DEFAULT 指定默认值
- PRECISION 声明列精度
- NOT NULL 将列指定为非
- NULLAUTO_INCREMENT 声明自增列
- INDEX 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
- UNIQUE_INDEX 创建唯一索引
- EMBEDDED 将结构设置为嵌入
- EMBEDDED_PREFIX 设置嵌入结构的前缀-忽略此字段
注意:
gorm也支持一些关联的结构体标签,比如外键,关联外键,等操作,通常在复杂的企业环境中,建议在库表设计时将相关表都设计成孤立表,具体的关联逻辑由业务层去实现(可能增加了开发的成本,不过当业务发展比较复杂时,这样做无疑是方便后期做扩展和优化的)
CRUD 操作
创建数据
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Create(&test)
使用 db.Create()
方法创建了一个ID为 3,姓名为 jackie,年龄为 18 的用户,并将其插入到数据库中。
删除数据
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Delete(&test)
使用 db.Delete()
方法删除数据库中的结构体 test。
更改数据
test := &Test{
ID: 3,
Name: "hello",
Age: 18,
}
db.Model(&test).Update("name", "world")
使用 db.Update()
方法更改结构体 test 中的名字 name。
查询数据
var tests []Test
db.Find(&users)
使用 db.Find()
方法查询数据库中的所有 test 数据,并将结果存储在 tests
变量中。
关闭数据库
当所有操作完成后,我们需要关闭数据库连接以释放资源:
db.Close()
或者:
db, err := gorm.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
// 处理连接错误
return err
}
defer db.Close()
// 执行数据库操作
// ...
使用 defer
关键字可以避免忘记在适当的位置手动关闭数据库连接,提高代码的可读性和可维护性。同时,这样的做法也可以在函数发生异常时保证数据库连接的关闭,从而避免资源泄漏。
小结
Gorm 是一个功能强大的 Go 编程语言中的 orm 库,具有简单易用、多数据库支持、自动迁移、事务支持和强大的查询功能等特点。使用 Gorm 可以大大简化数据库操作的开发工作,提高开发效率,希望大家看完能够有所收获。