Golang下的ORM框架-Gorm框架学习记录(1) | 青训营笔记

42 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

Gorm的介绍和相关特性

Gorm是Golang语言中一款性能极好的ORM库,即,设计简洁,功能强大,自由扩展的全功能ORM

Gorm的设计原则:API精简,测试优先,最小惊讶,灵活扩展,无依赖,可信赖

Gorm相关特性

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,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框架之中,它对各个驱动包进行了简单地包装,方便我们的使用

常用的数据库以及导入路径如下:

我本人的安装配置

"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)