这是我参与「第五届青训营 」伴学笔记创作活动的第 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需要大量练习才可以熟练使用,其中操作上下文使用中间件等等都需要有一定的认知基础
- 我参考了哪些外部博客/笔记/文章?