ORM框架 GORM | 青训营笔记

232 阅读3分钟

什么是 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)