go-zero我是如何把gorm整合进go-zero的?(代码片段)

jiangxiaoju jiangxiaoju     2023-03-14     577

关键词:

原创不易,未经允许,请勿转载。

go-zero提供的代码生成器里面,没有提供orm框架操作,但是提供了遍历的缓存操作。但是gorm框架的话,没有比较好的缓存插件,虽然有一个gcache,但不支持gorm2.0版本。

所以我打算把这两个结合起来。在gorm官方文档中提到了一个接口,可以获取到生成的sql语句。

所以可以利用gorm当作一个sql语句的生成器,把生成后的sql语句放到go-zero生成的模板中去执行。

gorm中的sql生成器

stmt := DB.Session(&SessionDryRun: true).First(&user, 1).Statement
stmt.SQL.String() //=> SELECT * FROM `users` WHERE `id` = $1 ORDER BY `id`
stmt.Vars         //=> []interface1

整合到go-zero中的效果如下
调用GeneralSQL,使用gorm生成sql后,去执行

func (m *defaultJojUserModel) FindOne(id int64) (*JojUser, error) 
	jojUsercenterJojUserIdKey := fmt.Sprintf("%s%v", cacheJojUsercenterJojUserIdPrefix, id)
	var resp JojUser
	err := m.QueryRow(&resp, jojUsercenterJojUserIdKey, func(conn sqlx.SqlConn, v interface) error 
		query, values := m.GeneralSQL(func(tx *gorm.DB) *gorm.DB 
			return tx.First(&resp, id)
		)
		return conn.QueryRow(v, query, values...)
	)
	switch err 
	case nil:
		return &resp, nil
	case sqlc.ErrNotFound:
		return nil, ErrNotFound
	default:
		return nil, err
	



func (m *defaultJojUserModel) GeneralSQL(queryFn func(tx *gorm.DB) *gorm.DB) (string, []interface) 
	tx := queryFn(m.gormDB.Session(&gorm.SessionDryRun: true))
	stmt := tx.Statement
	return stmt.SQL.String(), stmt.Vars


关于效率的问题,做了一个简单的测试,使用gorm生成sql的话,生成1e5次耗时304.1878ms

type ArticleComment struct 
	Id              int              `json:"id"`
	Content         string           `json:"content"`
	ReplyComment    *ArticleComment  `json:"replyToComment"`  // 该评论回复的评论
	ParentCommentId int              `json:"parentCommentId"` // 父评论Id
	ChildComment    []ArticleComment `json:"childComment"`    //以该评论未父节点的所有评论
	CreateTime      string           `json:"createTime"`      // 回复时间


func main() 
	begin := time.Now()

	for i := 0; i < 100000; i++ 
		GeneralSQL(func(tx *gorm.DB) *gorm.DB 
			return tx.Find(&Article, []int1, 2)
		)
	

	end := time.Now()
	fmt.Println(end.Sub(begin))

func GeneralSQL(queryFn func(tx *gorm.DB) *gorm.DB) (string, []interface) 

	tx := queryFn(db.Session(&gorm.SessionDryRun: true))
	stmt := tx.Statement
	return stmt.SQL.String(), stmt.Vars


如果这篇文章对您有所帮助,麻烦点个一键三连。

原创不易,未经允许,请勿转载。

博客主页:https://xiaojujiang.blog.csdn.net/

javascript怎么把对象里的数据整合进另外一个数组里

https://blog.csdn.net/qq_26222859/article/details/70331833varjson1=["guoshui":[300000,500000,600000,800000,1000000,1200000,1400000,1600000,1800000,1600000,1400000,1200000],"dishui":[1100000,1200100 查看详情

git整合进idea

Git关联IDEA进入File->settings搜索Git点击Test,下图表示正确在settings中搜索Github添加账号,填写用户名和密码即可 查看详情

一些常用的功能整合进spring-boot里面

一由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。 附上自己的项目地址https://gitee.com/a247292980/springBoot二第一个就是springboot的helloworld了,具体不说什么,就是快捷开发。写这个的速度限制是我... 查看详情

如果你的shiro没学明白,那么应该看看这篇文章,将shiro整合进springboot

最近在做项目的时候需要用到shiro做认证和授权来管理资源在网上看了很多文章,发现大多数都是把官方文档的简介摘抄一段,然后就开始贴代码,告诉你怎么怎么做,怎么怎么做相信很多小伙伴即使是跟着那些示例代码做完配... 查看详情

如何防止 gorm 将自定义整数类型转换为字符串?

】如何防止gorm将自定义整数类型转换为字符串?【英文标题】:Howtopreventgormfromconvertingcustomintegertypesintostrings?【发布时间】:2021-05-0123:20:38【问题描述】:我在将gorm与具有整数属性的自定义类型一起使用时遇到了麻烦。Gorm倾向... 查看详情

Go GORM 有很多关系。如何将数据存储到MYSQL DB

...hedatatoMYSQLDB【发布时间】:2021-12-2818:41:06【问题描述】:我是后端新手,也是golang和gorm的新手。我通过在go和gorm中使用has-many构建简单的api来学习后端。我正在尝试使用“TripId”的外键创建“Trip”表和“SingleTrip”表 查看详情

cout如何输出把char型变量当做整型输出?

cout如何输出把char型变量当做整型输出?参考技术A#include<iostream.h>voidmain() chars='a'; cout<<(int)s<<endl;本回答被提问者采纳 参考技术B将它传给整型变量,然后将变量输出。 查看详情

gorm / go 如何正确连接两个表?

】gorm/go如何正确连接两个表?【英文标题】:gorm/gohowtojointwotablesproperly?【发布时间】:2022-01-1217:54:54【问题描述】:我的消息结构;typeMessagestructIdint`json:"id"gorm:"primaryKey;AUTO_INCREMENT"`Messagestring`json:"message"`Senderint`json:"sender"gorm: 查看详情

esxi6如何添加多喝sata控制器驱动?

家用主机一台,安装ESXI6,主板自带intelsata控制器不被ESXI支持,需用第三方整合进安装盘,没问题,可以安装,外加一个pciesata扩展卡,在又一次整合驱动时,提示要替换上一次整合的sata驱动,替换了以后就只能认出外加的pci-es... 查看详情

如何在 Gorm 中留下连接子查询计数

】如何在Gorm中留下连接子查询计数【英文标题】:HowtoleftjoinsubquerycountinGorm【发布时间】:2021-12-1921:03:32【问题描述】:我希望我的Gorm查询返回正确的version_count。我的Gorm查询返回0version_count,而我的MySQL查询返回version_count。我... 查看详情

如何指定数组gorm golang的默认值?

】如何指定数组gormgolang的默认值?【英文标题】:howtospecifydefaultvalueofarraygormgolang?【发布时间】:2022-01-1122:44:30【问题描述】:我用的是gorm和postgresql,这是模型typeBoardstructIduint`gorm:"primaryKey;autoIncrement;unique"json:"id"`Owneruint`json:"o... 查看详情

如何在 Grails/GORM 中将派生属性设置为小写?

】如何在Grails/GORM中将派生属性设置为小写?【英文标题】:HowtosetaderivedpropertytolowercaseinGrails/GORM?【发布时间】:2013-11-2307:19:24【问题描述】:这是一个新手问题——感谢您的帮助。我想在我的域模型中将派生属性设置为小写。... 查看详情

包含gorm.modle的结构体如何查询

参考技术AGORM定义一个gorm.Model结构体其包括字段ID、CreatedAt、UpdatedAt、DeletedAt.typeUserstructgorm.ModelNamestring字段权限控制。 查看详情

如何在 GORM 中按排序顺序保存数据

】如何在GORM中按排序顺序保存数据【英文标题】:HowtopersistdatainasortedorderinGORM【发布时间】:2013-11-2220:18:41【问题描述】:这是一个新手问题,任何帮助将不胜感激。我有一个类Item如下。类项目字符串名称//其他属性...静态约... 查看详情

如何批量删除 Grails/GORM 中的记录?

】如何批量删除Grails/GORM中的记录?【英文标题】:HowdoyoubulkdeleterecordsinGrails/GORM?【发布时间】:2011-01-1500:19:35【问题描述】:我有一个表,其中包含需要根据一组标准定期清除的记录。我原以为我可以使用标准构建器来删除记... 查看详情

如何使用 GORM 为 Mongo 的低级 API 进行安全插入?

】如何使用GORM为Mongo的低级API进行安全插入?【英文标题】:HowtodosafeinsertsusingGORMforMongo\'slow-levelAPI?【发布时间】:2011-10-1421:39:05【问题描述】:我正在尝试使用GORM为Mongo的低级API进行安全插入。我在一个干净的Grails项目中重现... 查看详情

如何在 Go-Gorm 中禁用默认错误记录器

】如何在Go-Gorm中禁用默认错误记录器【英文标题】:HowtodisabledefaulterrorloggerinGo-Gorm【发布时间】:2019-09-1709:49:46【问题描述】:我在MySQL中使用GORM,我遇到并处理了错误Error1062:Duplicateentry。问题是它仍然打印到控制台。gym/models/... 查看详情

如何覆盖 Grails GORM 中关系的级联删除?

】如何覆盖GrailsGORM中关系的级联删除?【英文标题】:HowdoIoverridethecascadedeleteforarelationinGrailsGORM?【发布时间】:2010-11-0906:54:34【问题描述】:我在使用Grails的GORM部分时遇到了一些问题。我正在使用Grails1.3.4和H2。在数据库中,... 查看详情