Go 框架三件套详解(Web/RPC/ORM) | 青训营笔记

206 阅读3分钟

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


一、Gorm

1.0 概念

GORM:是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。
ORM是什么?
答:其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。

1.1 特性

  • 全功能 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…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

1.2 安装

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

1.3 快速安装


package main  

import (   
    "gorm.io/gorm"   
    "gorm.io/driver/sqlite" 
)  
type Product struct {   
    gorm.Model   
    Code  string   
    Price uint 
}  
func main() {   
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})   
    if err != nil {     
        panic("failed to connect database")   
}    
    // 迁移 schema   
    db.AutoMigrate(&Product{})    
    // Create   
    db.Create(&Product{Code: "D42", Price: 100})   
    // Read   
    var product Product   
    db.First(&product, 1) 
    // 根据整形主键查找   
    db.First(&product, "code = ?", "D42") 
    // 查找 code 字段值为 D42 的记录    
    // Update - 将 product 的 price 更新为 200   
    db.Model(&product).Update("Price", 200)   
    // Update - 更新多个字段   
    db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段   
    db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})    
    // Delete - 删除 product   
    db.Delete(&product, 1) 
}

1.4 插入内容——DSN

Data Source Name (DSN)的PDO命名惯例为:PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,如主机名、端口和数据库名。它是PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,如主机名、端口和数据库名。

1.5 数据库接口

GORM 提供了 DB 方法,可用于从当前 *gorm.DB 返回一个通用的数据库接口 *sql.DB

// 获取通用数据库对象 sql.DB,然后使用其提供的功能
sqlDB, err := db.DB()

// Ping
sqlDB.Ping()

// Close
sqlDB.Close()

// 返回数据库统计信息
sqlDB.Stats()

注意 如果底层连接的数据库不是 *sql.DB,它会返回错误

1.6 连接池

连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。 连接池有什么好处

  • 减少连接创建时间
  • 简化的编程方式
  • 受控的资源使用
    // 获取通用数据库对象 sql.DB ,然后使用其提供的功能 
    sqlDB, err := db.DB()  
    // SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
    sqlDB.SetMaxIdleConns(10) 
    // SetMaxOpenConns 设置打开数据库连接的最大数量。   
    sqlDB.SetMaxOpenConns(100)  
    // SetConnMaxLifetime 设置了连接可复用的最大时间。 
    sqlDB.SetConnMaxLifetime(time.Hour)

1.7 约定

约定大于配置

  • 表名为struct name的snake cases复数格式
  • 字段名为field name的snake_case单数格式
  • ID / ld字段为主键,如果为数字,则为自增主键
  • CreatedAt字段,创建时,保存当前时间
  • UpdatedAt字段,创建、更新时,保存当前时间
  • gorm.DeletedAt字段,默认开启soft delete模式

1.8 Gorm可连接的数据库

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server;

// 以连接SQLServer数据库为例
import ( 
    "gorm.io/driver/sqlserver" 
    "gorm.io/gorm" 
) 
dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
db,err := gorm.Open(sqlserver.Open(dsn),&gorm.Config{)

GORM通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动。

1.9 Gorm事务

Gorm提供了Begin、Commit、Rollback方法用于使用事务。

// 开始事务 
tx := db.Begin()  
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db') tx.Create(...)  
// ...  
// 遇到错误时回滚事务 
tx.Rollback()  
// 否则,提交事务 
tx.Commit()

GORM 提供了 SavePointRollbackto 来提供保存点以及回滚至保存点

tx := DB.Begin() 
tx.Create(&user1)  
tx.SavePoint("sp1") 
tx.Create(&user2) 
tx.RollbackTo("sp1") // 回滚 user2  
tx.Commit() // 最终仅提交 user1

二、Kitex


2.0 概念

Kitex是字节内部的Golang微服务PRC框架。

三、Hertz

未完待续...