綾波レイ
AYANAMI REI

个人技术总结

技术概述

gormgo语言比较流行的ORM框架之一,在用于数据库关系对象映射时比较方便。难点主要在关联表的处理和各种API的使用

技术详述

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,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函数(selectorder)反而造成代码有点冗余,使用原生sql语句反而更易于阅读和编写(毕竟大家都熟悉sql语句)。总体来说,在处理简单语句方面,易于理解使用,还是很方便的。对于使用过django相关ORM的人很友好(据说API基本一致)。

参考

GORM官方文档

posted @ 2021-06-27 18:11  Arturia_Xenon  阅读(55)  评论(0编辑  收藏  举报