这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
Gorm
Gorm 是一个已经迭代了10年+的功能强大的ORM框架,拥有非常丰富的开源扩展 ORM:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。
- 安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
- 基本使用
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)
}
约定:GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
- gorm.Model
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 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
GORM 通过驱动来连接数据库,如果需要连接其他类型的数据库,可以复用、自行开发驱动
- 创建数据
如何使用Upsert? 使用clause.OnConflict处理数据冲突 如何使用默认值? 使用default标签为字段定义默认值
- 查询
GORM 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误
使用Find查询多条数据,查询不到数据不会返回错误
当使用结构体作为查询条件时,GORM只会查询非零值字段。这意味着如果您的字段值为0、“、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。
Kitex
Kitex 是Golang微服务RPC框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。
参考:www.cloudwego.io/zh/docs/kit…
- 安装
- 确保
GOPATH环境变量已经被正确地定义(例如export GOPATH=~/go)并且将$GOPATH/bin添加到PATH环境变量之中(例如export PATH=$GOPATH/bin:$PATH);请勿将GOPATH设置为当前用户没有读写权限的目录 - 安装 kitex:
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest - 安装 thriftgo:
go install github.com/cloudwego/thriftgo@latest
- 使用IDL定义服务与接口
如果我们要进行RPC,就需要知道对方的接口是什么,需要穿什么参数,同时也需要知道返回值是什么样的。这时候就需要通过IDL来约定双方的协议。
Thrift: thrift.apache.org/docs/idl.ht…
Proto3: developers.google.com/protocol-bu…
- 生成代码
kitex -service a.b.c hello.thrift
# 若当前目录不在 $GOPATH/src 下,需要加上 -module 参数,一般为 go.mod 下的名字
kitex -module "your_module_name" -service a.b.c hello.thrift
- build.sh 构建脚本
- kitex_gen:IDL内容相关的生成代码,主要是基础的S/C代码
- main.go:程序入口
- handler.go:用户在该文件里实现IDL
- service: 定义的方法
- 服务注册与服务发现
Kitex 已经通过社区开发者的支持,完成了 ETCD、ZooKeeper、Eureka、Consul、Nacos、Polaris 多种服务发现模式,当然也支持 DNS 解析以及 Static IP 直连访问模式,建立起了强大且完备的社区生态,供用户按需灵活选用。
ETCD扩展:github.com/kitex-contr…
其他参考:www.cloudwego.io/zh/docs/kit…
Hertz
Hertz 是HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性的特点。
参考:www.cloudwego.io/zh/docs/her…
- 安装: go install github.com/cloudwego/hertz/cmd/hz@latest
- 路由:
Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由
Hertz 提供了路由组( Group )的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。
Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。 路由的优先级:静态路由 > 命名路由 > 通配路由
- 代码生成工具
通过定义IDL文件即可生成对应的基础服务代码