Go框架三件套 | 青训营

153 阅读4分钟

ORM框架 ——Grom

ORM,即对象关系映射(Object Relational Mapping),可以简单理解为将关系型数据库中的数据表映射为编程语言中的具体的数据类型,而GORM库就是一个使用Go语言实现的且功能非常完善易使用的ORM框架。

1.安装

使用go get -u安装GROM框架。

go get -u gorm.io/gorm

安装相应的数据库驱动。GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Serve

go get -u gorm.io/driver/mysql

2.Grom的基本使用

Gorm的默认约定

  1. Grom使用名为ID的字段作为主键
  2. 使用结构体的蛇形负数作为表名
  3. 字段名的蛇形作为列名
  4. 使用CreatedAt、UpdatedAt字段作为创建、更新时间
package main

import (
  "gorm.io/gorm"
  "gorm.io/driver/sqlServer"
)

type Product struct { //定义gorm model
  ID    int //默认为主键
  Code  string
  Price uint
}

func (p Product) TableName() string { //为model定义表名
  return "product" //返回表名

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

func main() {
dsn := //
  db, err := gorm.Open(mysql.Open(dsn),&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)
}

GORM 提供了 Firstdb.First(&user)、Takedb.Take(&user)、Lastdb.Last(&user) 方法,以便从数据库中检索单个对象。当查询数据库没有找到记录时,它会返回 ErrRecordNotFound 错误。

如果想避免ErrRecordNotFound错误,可以使用Find查询多条记录.

user := make([]*User,0)
result := db.Where("age > 10").Find(&users)
fmt.Println(result.RowsAffected)

当使用结构作为条件查询时,Gorm只会查询非零值字段,这意味着如果您的字段值为0,",false或其他零值,该字段不会被用于构建查询条件,使用map来构建查询条件.

db.Where(map[string]interface{}{"name":"zhang","Age":0}).Find($users)

使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。

// 根据 struct 更新
db.Model(&User{ID:3}).Updates(User{Name: "hello", Age: 18})

// 根据 map 更新
db.Model(&User{ID:3}).Updates(map[string]interface{}{"name": "hello", "age": 18})

Gorm提供了grom.DeletedAt用于帮助用户实现软删除。拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除。但GORM会将DeletedAt设置为当前时间,并且不能通过正常查询方法得到,但使用Unscoped可以查询到被软删除的数据。

RPC框架——Kitex

Kitex 是字节内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展(目前对Windows的支持不完善,如果开发环境是Windows建议使用虚拟机或WSL2)

使用 IDL 定义服务与接口 如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

namespace go api
struct Request {
  1: string message
}
struct Response {
  1: string message
}
service Echo{
  fResponse echo(1: Request'req)
}

HTTP框架——Hertz

Hertz 是字节内部的 HTTP 框架参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点。

Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由

Hertz 提供了路由组( Group )的能力,用于支持路由分组的功能

Hertz 提供了参数路由和通配路由,路由的优先级为: 静态路由 >命名路由 >通配路由

Hertz 提供了 Bind、Validate、BindAndValidate 函数用于进行参数绑定和校验

Hertz 的中间件主要分为客户端中间件与服务端中间件

Hertz 提供了 HTTP Client 用于帮助用户发送 HTTP 请求

Hertz 提供了代码生成工具 H,通过定义IDL(nteface description language ) 文件即可生成对应的基础服务代码