什么是 ORM
Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作。
什么是GORM
GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开发者对于 SQL 语言的掌握程度,使用提供的 API 进行底层数据库的访问。
换句话说,有了 GORM,就不需要程序员精通 SQL 了(bushi),只需要通过操作类以及类的方法的方式来操作数据库。
GORM 使用
安装GORM
使用 go get 安装 gorm 和 mysql 驱动
go get github.com/jinzhu/gorm
go get -u gorm.io/driver/mysql
使用 GORM 连接MySQL
使用了 go mod 的话,程序会自动 import 进去
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
//dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
//db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:123456@tcp(192.168.168.101:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
}
我们导入了gorm.io/driver/mysql这个包,这是 mysql 的驱动,使得 gorm 能够连接上 mysql。
创建映射表结构的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,这个 struct 里面的字段后面将会被映射成为 mysql 表的字段。
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,且该字段为主键
CRUD
增
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Create(test)
删
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Delete(test)
查
var testResult Test
db.Where("name = ?", "hello").First(&testResult)
fmt.Println("result: ", testResult)
改
test := &Test{
ID: 3,
Name: "hello",
Age: 18,
}
db.Model(&test).Update("name", "world")
总结
通过上面的描述,已经可以通过 GORM 进行基本的建表以及对表进行增删查改操作了,已经算是入门了,后续有关 GORM 的高级操作比如事务、时间追踪、Find、Convention等等可以自行查阅官方文档进行学习,官方文档链接放在下面:
参考资料:
官方文档
Gin-使用GORM操作mysql 数据库 - 掘金 (juejin.cn)
Go组件学习——gorm四步带你搞定DB增删改查 - 掘金 (juejin.cn)
Golang下的ORM框架gorm的介绍和使用 - 知乎 (zhihu.com)