Go框架三件套 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

笔记

  • 本堂课的知识要点有哪些?

1.gorm

2.Kitex

3.Hertz

  • 本堂课介绍了哪些知识点?

1.gorm

连接数据库

db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
  defer db.Close()

创建:

user := User{Name: "q1mi", Age: 18}

db.NewRecord(user) // 主键为空返回`true`
db.Create(&user)   // 创建user
db.NewRecord(user) // 创建`user`后返回`false`

更新:

user := User{Name: "q1mi", Age: 18}

db.NewRecord(user) // 主键为空返回`true`
db.Create(&user)   // 创建user
db.NewRecord(user) // 创建`user`后返回`false`

查询:

// 根据主键查询第一条记录
db.First(&user)
//// SELECT * FROM users ORDER BY id LIMIT 1;

// 随机获取一条记录
db.Take(&user)
//// SELECT * FROM users LIMIT 1;

// 根据主键查询最后一条记录
db.Last(&user)
//// SELECT * FROM users ORDER BY id DESC LIMIT 1;

// 查询所有的记录
db.Find(&users)
//// SELECT * FROM users;

// 查询指定的某条记录(仅当主键为整型时可用)
db.First(&user, 10)
//// SELECT * FROM users WHERE id = 10;

where条件

// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;

// Get all matched records
db.Where("name = ?", "jinzhu").Find(&users)
//// SELECT * FROM users WHERE name = 'jinzhu';

// <>
db.Where("name <> ?", "jinzhu").Find(&users)
//// SELECT * FROM users WHERE name <> 'jinzhu';

// IN
db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
//// SELECT * FROM users WHERE name in ('jinzhu','jinzhu 2');

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
//// SELECT * FROM users WHERE name LIKE '%jin%';

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
//// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
//// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';

// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
//// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';

删除:

// 删除现有记录
db.Delete(&email)
//// DELETE from emails where id=10;

// 为删除 SQL 添加额外的 SQL 操作
db.Set("gorm:delete_option", "OPTION (OPTIMIZE FOR UNKNOWN)").Delete(&email)
//// DELETE from emails where id=10 OPTION (OPTIMIZE FOR UNKNOWN);

hook:

GORM 在提供了 CURD 的 Hook 能力。
Hook 是在创建、 查询、更新、删除等
操作之前、之后自动调用的函数。
如果任何 Hook 返回错误,GORM 将
停止后续的操作并回滚事务。

性能提高:

对于写操作(创建、更新、删除)
为了确保数据的完整性,GORM会
将它们封装在事务内运行。但这会降低性能,你可以使用
SkipDefaultTransaction 关闭默认事务。
使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度,本机测
试提高大约 35 %左右。

2.Kitex

生成代码

kitex -module example-service example echo.thrift

NewClient方法创建Client

Echo方法发起请求

3.Hertz

h:=server.Default(server.WithHostPorts("127.0.0.1:8080"))
h.GET(...)
h.Spin()
  • 有什么实践举例帮助理解知识点?

用户记笔记功能的实现

使用了MySQL,Etcd,Kitex,GORM,Hertz,Jeager等等技术

通过Etcd实现Kitex的注册和调用,使用gorm操作数据库,Hertz作为http框架

  • 本章有什么知识点不容易掌握?

gorm对于数据库的操作有很多,包括内联条件,软删除等等操作

Hertz需要大量练习才可以熟练使用,其中操作上下文使用中间件等等都需要有一定的认知基础

  • 我参考了哪些外部博客/笔记/文章?

www.liwenzhou.com/posts/Go/go…