这是我参与「第五届青训营」笔记创作活动的第五天,本次课程介绍了Go的三大框架,其中orm框架理解比较清楚,另外两个的理解不是太深刻,先把笔记写下吧。
框架使用与实战
框架使用
Gorm
gorm框架(数据库)
-
基本使用
-
定义gorm model 表名
- model即为结构体,其中内容即为字段
- TableName()为grom默认接口
-
连接数据库
- dsn为数据库相关信息,&gorm.config()为配置信息
-
创建数据
- db.create()
- db.create(&对象1)//创建一个数据1的数据
- db.create(slice[])//创建多条数据
- db.create()返回的也是Gorm对象,利用res.Error获取错误信息
- db.create()
-
数据冲突
- 利用clause.OnConflict处理冲突
- create,update,delete为调用sql语句执行,到此终止。
- 利用clause.OnConflict处理冲突
-
利用gorm tag实现主键定义,确定列名,设定默认值等
- 定义主键
gorm:"primarykey" - 定义列名
gorm:"Column:列名" - 设定默认值
gorm:"default:默认值"
- 定义主键
-
查询数据
- first 只能查询单条数据
- 按主键升序的顺序获得第一条数据
- 查询不到返回ErrRecordNotFound
- find可以查询多条数据
- 查询不到不会返回错误,而返回空数组
- 结构体作为查询条件时,如果你的字段为0,false,""或其他零值不会用于构造条件,可以使用map来对0条件的设定
- first 只能查询单条数据
-
更新数据
- 单列更新
db.Model(&model).where(条件).Updates("column":列名,value)
- 多列更新
db.Model(&model1).Updates(Product{price:200,Code:"123"})//使用结构体更新仅更新非0字段db.Model(&model1).Updates(Product{price:200,Code:""})//使用结构体更新仅更新非0字段
- 利用map更新
db.Model(&model1).Updates(map[string]interface{}{price:200,code:F42})db.Model(&User(ID:111)).Select("name").Updates(map[string]interface{}{name:"hello","age":18,actived:false//0值条件)- 相当于
UPDATE users SET name="hello" Where id=111
- 相当于
- SQL表达式更新
- 单列更新
-
删除
- 物理删除
- delete
db.delete(&model,主键:n)db.delete(&model,条件)db.where("name Like ?",值)。Delete()//?是占位符,和printf类似
- delete
- 软删除
- DeletedAt
- 在创建model时加入字段 Deleted gorm.DeletedAt
- 软删除后,正常查询无法查询到,DeletedAt 置为当前时间
- 使用Unscoped可以查询到软删除数据
- 物理删除
-
事务
- 提供了 Begin,Commit,Rollback方法方便使用事务
- 建议使用
-
Hook
- 创建,查询,更新,删除等操作之前,之后自动调用的操作,若hook后返回错误,GORM会停止后续操作并回滚事务
-
性能提高
- 关闭默认事务 SkipDefaultTransaction
- 使用PrepareStmt 进行预编译
-
相关工具
-
约定:
- Gorm默认使用ID字段作为主键
- 结构体的蛇形负数作为表面
- 字段的蛇形作为列明
- CreatedAt,UpdateAt 字段作为创建,更新时间
-
支持数据库 MySQL,SQLServer,PostgreSQL,SQLlite
-
DSN :
Kitex
RPC框架
- 安装代码生成工具
- IDL
- 利用IDL定义服务与接口
- 定义IDL
- kitex -moudule example -service emample echo.thrift //生辰代码
- build.sh 构建脚本
- kitex_gen:IDL内容相关的生成代码,基础的server/client代码
- main.go 入口文件
- handler, 在该文件中实现IDL service 定义的方法
- 生态
Hertz
HTTP框架
- Hertz实现 监听端口并注册一个Get路由函数
-
- 路由注册
-
- 路由优先级
- 静态路由>命名路由>通配路由
- 参数绑定
- 将HTTP请求中的参数转入结构体
- 用于绑定的校验的参数
- Bind
- validate
- BindAndValidate
- Go tag 用于绑定参数
- vd 实现校验
-
- 中间件不是很明白,后期学习后补正
- Client
-
- 代码生成工具HZ
- 定义IDL 生成服务端和客户端代码