这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
Gorm的介绍和相关特性
Gorm是Golang语言中一款性能极好的ORM库,即,设计简洁,功能强大,自由扩展的全功能ORM
Gorm的设计原则:API精简,测试优先,最小惊讶,灵活扩展,无依赖,可信赖
Gorm相关特性
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload
、Joins
的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
Gorm安装
在Golang中需要使用一些驱动包对指定数据库进行操作,例如我们常用的MySQL需要使用github.com/go-sql-driver/mysql 库,而Sqlite需要使用 github.com/mattn/go-sqlite3 库来支持,但在Gorm框架之中,它对各个驱动包进行了简单地包装,方便我们的使用
常用的数据库以及导入路径如下:
- mysql:github.com/jinzhu/gorm…
- postgres: github.com/jinzhu/gorm…
- sqlite: github.com/jinzhu/gorm…
- sqlserver: github.com/jinzhu/gorm…
我本人的安装配置
"gorm.io/driver/mysql"
"gorm.io/gorm"
Gorm约定
我第一次接触Gorm开始,对于Gorm如何将数据库内的数据结构和代码的数据结构进行绑定十分的好奇,下面是一个案例代码
type UserInfo struct {
UserID int64 `gorm:"column:UserID" json:"id,omitempty"` // 用户id
UserName string `gorm:"column:Name"json:"name,omitempty"` // 用户名称
UserFollowCount int `gorm:"column:FollowCount"json:"follow_count,omitempty"` // 用户关注数
UserFollowerCount int `gorm:"column:FollowerCount"json:"follower_count,omitempty"` // 用户粉丝数
IsFollow bool `gorm:"column:IsFollow"json:"is_follow,omitempty"` // 是否关注
}
Gorm倾向于约定,而不是配置。即,在默认的情况下,Gorm使用ID作为主键,用结构体名的蛇形复数作为表名,字段名的蛇形作为列名
可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
下面放一个案例代码:
type User struct {
Name string `gorm:"<-:create"` // 允许读和创建
Name string `gorm:"<-:update"` // 允许读和更新
Name string `gorm:"<-"` // 允许读和写(创建和更新)
Name string `gorm:"<-:false"` // 允许读,禁止写
Name string `gorm:"->"` // 只读(除非有自定义配置,否则禁止写)
Name string `gorm:"->;<-:create"` // 允许读和写
Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读)
Name string `gorm:"-"` // 读写操作均会忽略该字段
}
Gorm连接数据库
Gorm框架官方支持的数据库类型有:MySQL, PostgreSQL, SQlite, SQL Server
下面是我自己使用Gorm框架连接MySQL的代码
config.toml文件
#关系型数据库配置
[mysql]
host = "***.**.***.***"
port = 3306
database = "******"
username = "******"
password = "************"
charset = "utf8mb4"
parse_time = true
loc = "Local"
#记录当前服务器的ip和启动端口号,当前服务器的ip用于生成对应的视频链接地址
[server]
ip = "***.***.***.***"
port = 8080
config.go文件
package config
import (
"fmt"
"github.com/BurntSushi/toml"
"log"
"strings"
)
type Mysql struct {
Host string
Port int
Database string
Username string
Password string
Charset string
ParseTime bool `toml:"parse_time"`
Loc string
}
type Server struct {
IP string
Port int
}
type Config struct {
DB Mysql `toml:"mysql"`
Server `toml:"server"`
}
var Info Config
// 包初始化加载时候会调用的函数
func init() {
if _, err := toml.DecodeFile("config/config.toml", &Info); err != nil {
panic(err)
}
//去除左右的空格
strings.Trim(Info.Server.IP, " ")
strings.Trim(Info.DB.Host, " ")
}
// DBConnectString 填充得到数据库连接字符串
func DBConnectString() string {
arg := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%v&loc=%s",
Info.DB.Username, Info.DB.Password, Info.DB.Host, Info.DB.Port, Info.DB.Database,
Info.DB.Charset, Info.DB.ParseTime, Info.DB.Loc)
log.Println(arg)
return arg
}
init_db.go
package models
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"tiktok_Demo/config"
)
var DB *gorm.DB
func InitDB() {
var err error
DB, err = gorm.Open(mysql.Open(config.DBConnectString()), &gorm.Config{
PrepareStmt: true, //缓存预编译命令
SkipDefaultTransaction: true, //禁用默认事务操作
//Logger: logger.Default.LogMode(logger.Info), //打印sql语句
})
if err != nil {
panic(err)
}
sqlDB, _ := DB.DB()
// 设置数据库连接池
sqlDB.SetMaxOpenConns(10)
}
下节我来介绍Gorm简单的CURD操作~
参考引用:GORM中文文档《GORM 中文文档》 | Go 技术论坛 (learnku.com)