go语言之框架-gorm | 青训营笔记

99 阅读2分钟

go语言之框架-gorm | 青训营笔记

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

Go框架三件套(Web/RPC/ORM)

  1. Gorm
  2. Kitex
  3. Hertz

什么是orm

介绍

Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库

它的作用是在关系型数据库和对象之间作一个映射,我们在具体的操作数据库,就不用和复杂的SQL语句摩擦,只要像平时操作对象一样操作它就可以了

ORM优缺点

优点

  • 提高开发效率

缺点

  • 牺牲执行性能
  • 牺牲灵活性
  • 弱化SQL能力

gorm

gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

模型声明

  • 表名为struct name的snake_cases (下划线连接)复数格式

  • 字段名为field name的snake_case单数格式

  • ID/Id字段为主键,如果为数字,则为自增主键

  • CreatedAt 字段,创建时,保存当前时间

  • UpdatedAt 字段,创建、更新时,保存当前时间

  • gorm.DeletedAt 字段,默认开启 soft delete 模式

GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定义
type Model struct {
    ID        uint `gorm:"primaryKey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt gorm.DeletedAt `gorm:"index"`
}

对于匿名字段,GORM 会将其字段包含在父结构体中,例如:

type User struct {
    gorm.Model
    Name string
}

// 等效于
type User struct {
    ID        uint `gorm:"primaryKey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt gorm.DeletedAt `gorm:"index"`
    Name      string
}

使用标签 embeddedPrefix 来为 db 中的字段名添加前缀

type Blog struct {
    ID      int
    Author  Author `gorm:"embedded;embeddedPrefix:author_"`
    Upvotes int32
}
​
// 等效于
type Blog struct {
    ID          int64
    AuthorName  string
    AuthorEmail string
    Upvotes     int32
}

MySQL,连接池链接

// 连接数据库
//dsn := "user:password@tcp(ip:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

GORM 使用database/sql维护连接池

sqlDB, err := db.DB()

// 空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)

// 打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)

// 连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)