GORM是Go语言中一个流行的ORM(Object Relational Mapping)框架,它能够对数据库表和代码中的数据模型进行全自动映射,使用GORM框架相比直接使用database/sql
包操作数据库更加方便。GORM的设计和许多其它语言流行的ORM框架类似,比如Python的Django ORM或是Laravel的Eloquent等,掌握一种后再学习GORM是十分轻松的。
官方文档:https://gorm.io/zh_CN/docs/index.html
项目Github地址:https://github.com/go-gorm/gorm
我们需要使用go get
命令安装GORM的依赖包,除此之外还需要安装数据库驱动,GORM提供了许多常用数据库的驱动,包括MySQL、PostgreSQL、Sqlite等,我们根据我们的需求安装对应的驱动即可。
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
虽然ORM框架在具体使用时会抹平底层细节,但不同的数据库驱动还是需要不同的配置方式来初始化,后续章节都以MySQL为例进行介绍,其它数据库参考文档进行配置即可。
GORM的用法其实很简单,我们这里直接看一个例子。下面代码我们定义了一个结构体Product
作为数据模型,结构体的字段Tag中我们定义了GORM所需的一些属性用于自动创建表结构,随后我们使用GORM将一条数据保存到数据库中。
model/product.go
package models
import "time"
type Product struct {
ProductId uint64 `gorm:"type:bigint;column:product_id;primaryKey;autoIncrement"`
ProductName string `gorm:"type:varchar(200);column:product_name;not null"`
CreateTime time.Time `gorm:"type:datetime;column:create_time;not null"`
}
func (*Product) TableName() string {
return "t_product"
}
数据模型包含3个字段:自增长主键,产品名,创建时间。其数据库中的数据类型分别为BIGINT
、VARCHAR(200)
、DATETIME
。
main.go
package main
import (
"demoorm/models"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
func main() {
// 初始化数据库连接
dsn := "root:root@tcp(127.0.0.1:3306)/netstore?charset=utf8mb4&parseTime=true&loc=Local"
conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// 创建并执行数据迁移
err = conn.AutoMigrate(&models.Product{})
if err != nil {
panic(err)
}
// 插入数据
product := models.Product{ProductName: "Nvidia显卡", CreateTime: time.Now()}
result := conn.Create(&product)
// 打印SQL执行的影响行数
fmt.Println(result.RowsAffected)
}
上面代码很简单,我们首先使用gorm.Open()
方法初始化了GORM,它返回一个*DB
指针。注意这步在实际开发中在程序启动时执行1次即可,类似标准库的database/sql
,GORM在底层也维护了数据库连接池,我们没必要多次初始化。随后我们执行了数据迁移,GORM框架会根据模型的字段定义自动建表。最后我们创建了一个结构体的实例,然后调用了Create()
方法将其保存到数据库中,它的参数是具体数据模型实例的指针,GORM底层会根据数据模型的Tag自动进行结构体字段到数据库表字段的映射。插入后我们读取了执行SQL影响的数据记录行数并打印了出来。如果这里想获取插入数据的主键,直接读取product.ProductId
即可。