这是我参与「第五届青训营 」伴学笔记创作活动的第3天。
Go 框架三件套详解(Web/RPC/ORM)
Gorm基本使用
定义Gorm model
type Product struct{
Code string
Price uint
}
定义表名
func(p Product)TableName()string{
return "product"
}
dsn包括user:aaaa@aaa@aaa(1.1.1.1:8888)/
db.Create()创建
Gorm使用名为ID的字段作为主键
字段名的蛇形为列名(蛇形即加入下划线)
db.First()根据主键查找
db.Model().Updata()更新数据
db.Delete()删除数据
使用CreateAt和UpdatedAt作为创建时间和更新时间
GORM支持MySQL、SQLServer
DSN包含连接数据库的信息
使用clause.OnConflict处理数据冲突
通过使用default标间为字段定义默认值
例如
type User struct {
ID int64
Name string gorm:"defalut:galeone"
Age int64 gorm:"default:18"
}
可以通过fmt.Println(res.Error)打印并获取err
使用First查询不到数据会返回ErrRecordNotFound
使用Find查询数据查询不到不会返回错误
如果查询0值要用Map构建查询条件
使用Struct更新时只会更新0值,更新0值要用Select
db.Model(&User{ID:1111}}.Select("name").Updates(map[string]interface{}{"name":"hello","age":"18"})//更新选定字段
gorm.DeleteAt软删,数据不会从数据库删除,但数据不会被除Unscoped之外的方法查询到
db.Delete()物理删除
type User struct {
ID int64
Name string gorm:"defalut:galeone"
Age int64 gorm:"default:18"
Deleted gorm.Delete
}//这样结构体支持软删
可以用Unscoped.Find找到被软删的数据
可以用Begin、Commit、Rollback使用事务,可以用Transaction自动提交事务(推荐使用),可以用SkipDefalutTransaction关闭默认事务
GORM提供了CURD的Hook能力,hook是自动调用的
GORM代码生成工具go-gorm/gen
GORM乐观锁go-gorm/optimisticlock
GORM手动索引go-gorm/hints
GORM分片库方案go-gorm/sharding(数据量大的时候会用)
ID:1111会兜底处理,0值默认不读取,无法区分0和0值
GORM有循环ID实现,但自动生成没有
GORM联表查询需要使用多个结构体
创建数据最好不要用循环
GORM初始化全局用一次,初始化多次会出问题
Kitex代码生成工具对Windows支持不完善
使用IDL定义服务与接口
使用kitex -module example -service example echo.thrift命令生成代码
Kitex服务默认监听端口8888
echo.NewClient()//创建Client
XDS扩展kitex-contrib/xds
Hertz服务监听8080端口
server.default初始化端口
提供GET、POST、PUT、DELETE、ANY用于注册路由
路由优先级:静态>命名>通配
Hertz提供Bind、Validate、BindAndValidate用于参数绑定和校验
Hertz中间件分为客户端中间件和服务端中间件
Hertz提供了HTTP Client用于帮助发送HTTP请求
Hertz性能:网络库Netpoll、Json编解码Sonic、使用sync.Pool解析优化
笔记项目demoapi(API服务)demouser(用户数据管理)demonote(笔记数据管理)
阅读www.cloudwego.io新手任务cloudwego/hertz/issues
hertz quick试用阶段
标准上下文传递源信息context.context
异步调用时一个上下文会被回收,会有问题,要用两个上下文
hertz服务中会调用rpc.clint
c.string作为responce返回了
用note实现和用hertz实现网关都可以
kitex底层用的netpoll性能更好,跑分性能远超其他框架