Go框架三件套——工程实践 | 青训营笔记

70 阅读3分钟

本文记录的是录播视频中遇到的不会的知识点,并不会一贯地按着ppt来罗列一些知识点,仅仅代表我个人的一些观点与看法,欢迎各位大佬指点问题。

Gorm

概述

Gorm 是 Golang 的一个 orm 框架。 ORM 是通过实例对象的语法,完成关系型 数据库的操作,是"对象-关系映射" (Object/Relational Mapping) 的缩写。

特性

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

安装

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

CRUD接口

创建记录

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}  
result := db.Create(&user) // 通过数据的指针来创建 
user.ID             // 返回插入数据的主键 
result.Error        // 返回 error 
result.RowsAffected // 返回插入记录的条数 

选定字段创建

用选定字段的来创建

db.Select("Name", "Age", "CreatedAt").Create(&user) 
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775") 

创建时排除选定字段

db.Omit("Name", "Age", "CreatedAt").Create(&user) // 
INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775") 

创建钩子

GORM 允许 BeforeSaveBeforeCreateAfterSaveAfterCreate 等钩子,创建记录时会调用这些方法, 详情请参阅 钩子

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {  
      u.UUID = uuid.New()      
      if u.Role == "admin" {        
         return errors.New("invalid role")     
      }     
        return } 

批量插入

将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。

var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} DB.Create(&users)  
for _, user := range users {   user.ID // 1,2,3 } 

Upsert 和 Create With Associations 也支持批量插入

Kitex

CloudWeGo-Kitex

Kitex[kaɪt’eks] 字节跳动内部的 Golang 微服务 RPC 框架,具有高性能强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选择。

架构设计 

image.png

Hertz

概览

CloudWeGo-Hertz

Hertz[həːts] 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttpginecho 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。 如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。

架构设计

image.png