GO语言学习之GORM框架详解
前言
继前两篇文章讲解了部分GO语言基本操作之后,本文将带大家继续学习了解GO语言非常重要实用的一种框架——GORM
下列是从官方文档中截取的部分有关GORM框架的信息
GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开发者对于 SQL 语言的掌握程度,使用提供的 API 进行底层数据库的访问。
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server。
作者是中国人,中文文档齐全,对开发者友好,支持主流数据库。
其特点如下:
全功能ORM
关联(包含一个,包含多个,属于,多对多,多种包含)
Callbacks(创建/保存/更新/删除/查找之前/之后)
预加载;
事务
复合主键
SQL Builder
自动迁移
日志
可扩展,编写基于GORM回调的插件
每个功能都有测试
开发人员友好
但GORM也并非全是优点,它牺牲了执行能力和灵活性,弱化了SQL能力,使得部分数据库操作变得更加繁琐
安装与连接
根据官方文档的内容,可以直接在goland或者vscode的终端执行以下命令进行安装
go get github.com/jinzhu/gorm
数据库连接
数据库连接有以下两种方式,一种简单,一种复杂,可以根据个人喜好进行选择
先需要在mysql中输入如下sql语句创建一个数据库:
create database gorm;
创建好后再输入下列sql语句进入该数据库:
use gorm;
随后在vscode或者goland中按照如下模板写入代码并执行
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
func main() {
// 参考 github.com/go-sql-driv… 获取详情
//dsn := "root:password@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:password@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local",
}), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
fmt.Println("success to link mysql")
select {}
}
注意:想要正确的处理 time.Time ,应使用parseTime 参数,(更多参数)要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为charset=utf8mb4
若未报错,则说明连接成功
表数据操作:增删改查
添加数据
在vscode或者goland中按照如下模板写入代码并执行
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
Id int
Name string
Age int
}
func main() {
dsn := "root:root123@tcp(127.0.0.1:3306)/gorm? charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&User{})
db.Create(&User{ Name: "张三", Age: 18, })
}
随后在mysql中输入下列语句查看数据表是否创建成功:
show tables;
若显示表名则说明操作成功,数据库已经连接,随后输入下列语句查看表中内容:
select *from users;
若成功显示则说明操作成功
查找数据
在vscode或者goland中按照如下模板写入代码并执行
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
Id int
Name string
Age int
}
func main() {
dsn := "root:root123@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&User{})
var user User
db.First(&user)
fmt.Println(user)
}
若在终端中成功输出之前添加的信息,则说明查找成功
更新数据
在vscode或者goland中按照如下模板写入代码并执行
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
Id int
Name string
Age int
}
func main() {
dsn := "root:root123@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)}
db.AutoMigrate(&User{})
user.Name = "lisi"
db.Save(&user)
fmt.Println(user)
}
若成功输出更改后的信息,则说明操作成功,此时我们再前往mysql中进行进一步确认:
select *from users; 若mysql中也输出正确的数据则说明操作成功
删除数据
在vscode或者goland中按照如下模板写入代码并执行
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
Id int
Name string
Age int
}
func main() {
dsn := "root:root123@tcp(127.0.0.1:3306)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)}
db.AutoMigrate(&User{})
db.Delete(&user)
}
此时我们再前往mysql中进行确认:
select *from users; 若mysql中也输出正确的数据则说明操作成功
gorm.Model
基本模型定义gorm.Model,包括字段 ID,CreatedAt,UpdatedAt,DeletedAt 参数说明: ID:主键自增长; CreatedAt:用于存储记录的创建时间; UpdatedAt:用于存储记录的修改时间; DeletedAt:用于存储记录的删除时间;
高级
结构体标签gorm的使用:
type User struct { Name string
gorm:"<-:create"// 允许读和创建 Name stringgorm:"<-:update"// 允许读和更新 Name stringgorm:"<-"// 允许读和写(创建和更新) Name stringgorm:"<-:false"// 允许读,禁止写 Name stringgorm:"->"// 只读(除非有自定义配置,否则禁止写) Name stringgorm:"->;<-:create"// 允许读和写 Name stringgorm:"->:false;<-:create"// 仅创建(禁止从 db 读) Name stringgorm:"-"// 读写操作均会忽略该字段 }
总结
本文主要介绍了 GORM 框架的相关基础知识,但具体的细节还是需要仔细研究官方文档。