1、简介
ORM
Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作。
gorm
GORM(Golang Object Relational Mapping)是一个针对Go语言的轻量级对象关系映射(ORM)库。它提供了一种简单而强大的方式来处理Go应用程序与关系型数据库的交互。
以下是GORM的一些主要特点和功能:
- 结构体映射:GORM允许将Go语言的结构体(struct)与数据库表进行映射,从而实现对象和关系数据之间的转换。
- 数据库支持:GORM支持多种主流关系型数据库,如MySQL、PostgreSQL、SQLite、SQL Server等。
- CRUD操作:GORM提供了便捷的方法来执行常见的数据库操作,包括创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)等。
- 查询构建器:GORM提供了灵活的查询构建器,可以通过链式调用方法来构建复杂的查询条件,支持条件筛选、排序、分页等操作。
- 关联关系管理:GORM支持定义和处理表之间的关联关系,如一对一、一对多、多对多等关系,通过预加载或延迟加载的方式进行关联数据的查询。
- 事务管理:GORM提供了事务支持,可以确保在一系列数据库操作中的原子性和一致性。
- 钩子函数:GORM支持在数据操作前后触发各种钩子函数,可以用于实现数据验证、数据转换等自定义逻辑。
总而言之,GORM是一个功能丰富且易于使用的ORM库,它可以大大简化Go语言程序与数据库之间的交互,提高开发效率。
Github
官方文档
2、如何使用Gorm
只要四步就能上手gorm,可以尽情的沉浸在毫无技术含量的CRUD世界。
2.1 下载gorm库
下载gorm库
go get -u github.com/jinzhu/gorm
这是比较原始的方式,现在有了go mod,我们可以更方便的配置,甚至不用配置。
写好代码,在文件下执行go build,go.mod会自动添加对于gorm的依赖包
github.com/jinzhu/gorm v1.9.10
当然,也可以手动添加这个依赖。
2.2 创建DB连接
建立数据库连接
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
var err error
db, connErr := gorm.Open("mysql", "root:rootroot@/dqm?charset=utf8&parseTime=True&loc=Local")
if connErr != nil {
panic("failed to connect database")
}
defer db.Close()
db.SingularTable(true)
}
gorm支持很多数据源包括PostgreSQL、MySQL等。
这里连接的是MySQL,所以需要引用"github.com/jinzhu/gorm/dialects/mysql"驱动。
通过上面声明,已经获取数据库的连接。
db.SingularTable(true)这句的作用后面会提到。
2.3 创建映射表结构的struct
定义数据库表结构对应的struct
比如这里我们要操作的是表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"`
}
每个字段后面的gorm是结构标记,可以用于声明对应数据库字段的属性。
比如ID后面的约束为该字段为bigint(20)类型,对应列表为id,且该字段为主键。
除此以外,还有更加丰富的标签定义参见官方文档:gorm.io/zh_CN/docs/…
2.4 CRUD
有了前面三步的铺垫,下面就可以执行真正写数据库操作了。
"增"
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Create(test)
"删"
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Delete(test)
"改"
test := &Test{
ID: 3,
Name: "hello",
Age: 18,
}
db.Model(&test).Update("name", "world")
"查"
var testResult Test
db.Where("name = ?", "hello").First(&testResult)
fmt.Println("result: ", testResult)