个人技术总结
技术概述
gorm
是go
语言比较流行的ORM框架之一,在用于数据库关系对象映射时比较方便。难点主要在关联表的处理和各种API的使用
技术详述
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload
、Joins
的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
技术的使用:根据文档调用各种API吧
问题和解决过程
在调用gorm
相关函数时,使用rows().Scan()
返回的是字节数据,需要进行类型转换才能使用
//返回关键词TOP10
func GetTopKeywordList() (results []KeyNum) {
var tmp1, tmp2 interface{}
rows, _ := db.Raw("SELECT name, count(*) FROM papercrawler.crawler_keyword group by name order by count(*) desc").Limit(10).Rows()
defer rows.Close()
for rows.Next() {
rows.Scan(&tmp1, &tmp2)
count, _ := strconv.Atoi(string(tmp2.([]byte)))
name := string(tmp1.([]byte))
results = append(results, KeyNum{
Name: name,
Count: count,
})
}
return
}
总结
总体来说,各种API都有提供,使用方便并且也易于理解。但是在使用过程中,在sql
语句过于复杂时,使用API函数(select
、order
)反而造成代码有点冗余,使用原生sql
语句反而更易于阅读和编写(毕竟大家都熟悉sql
语句)。总体来说,在处理简单语句方面,易于理解使用,还是很方便的。对于使用过django
相关ORM的人很友好(据说API基本一致)。