脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - gorm整合进go-zero的实现方法

gorm整合进go-zero的实现方法

2022-09-07 10:22jiangxiaoju Golang

go-zero提供的代码生成器里面,没有提供orm框架操作,但是提供了遍历的缓存操作,所以可以利用gorm当作一个sql语句的生成器,把生成后的sql语句放到go-zero生成的模板中去执行,对gorm整合进go-zero的实现方法感兴趣的朋友一起看看吧

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

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

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

gorm中的sql生成器

?
1
2
3
stmt := DB.Session(&Session{DryRun: true}).First(&user, 1).Statement
stmt.SQL.String() //=> SELECT * FROM `users` WHERE `id` = $1 ORDER BY `id`
stmt.Vars         //=> []interface{}{1}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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.Session{DryRun: true}))
    stmt := tx.Statement
    return stmt.SQL.String(), stmt.Vars
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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{}, []int{1, 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.Session{DryRun: true}))
    stmt := tx.Statement
    return stmt.SQL.String(), stmt.Vars

到此这篇关于gorm整合进go-zero的方法的文章就介绍到这了,更多相关gorm整合进go-zero内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_43058685/article/details/123457803

延伸 · 阅读

精彩推荐
  • GolangGolang如何优雅连接MYSQL数据库?

    Golang如何优雅连接MYSQL数据库?

    Go原生就支持连接数据库,所以在使用 Golang 开发时,当需要数据库交互时,即可使用database/sql包。...

    JavaEdge5242020-11-23
  • Golang利用Golang实现TCP连接的双向拷贝详解

    利用Golang实现TCP连接的双向拷贝详解

    公司中遇到了一个使用golang编写的agent程序,所以这篇文章主要给大家介绍了关于利用Go如何实现TCP连接的双向拷贝的相关资料,文中通过示例代码介绍的非...

    陶文3162020-05-09
  • Golang从go语言中找&和*区别详解

    从go语言中找&和*区别详解

    这篇文章主要介绍了从go语言中找&和*区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    梅老板0005162020-06-24
  • Golanggolang中tar压缩和解压文件详情

    golang中tar压缩和解压文件详情

    这篇文章主要给大家介绍golang中tar压缩和解压文件,文章以查看官方文档自带的给大家演习一下golang的archive/tar压缩和解压功能,需要的朋友可以参考一下...

    快乐编程8572021-11-30
  • Golang选择 Go API 框架时要考虑的四件事

    选择 Go API 框架时要考虑的四件事

    虽然我不会在这篇文章中比较或推荐任何特定的框架,但我将尝试通过介绍为 Go 中的下一个 API 项目选择框架时应该考虑的四个关键事项给你参考。...

    幽鬼7842021-12-03
  • Golanggolang中的空slice案例

    golang中的空slice案例

    这篇文章主要介绍了golang中的空slice案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    晨梦思雨9742021-06-02
  • GolangGo 如何基于IP限制HTTP访问频率的方法实现

    Go 如何基于IP限制HTTP访问频率的方法实现

    这篇文章主要介绍了Go 如何基于IP限制HTTP访问频率的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    zx7362020-05-31
  • Golang在Visual Studio Code中配置GO开发环境的详细教程

    在Visual Studio Code中配置GO开发环境的详细教程

    这篇文章主要介绍了在Visual Studio Code中配置GO开发环境的详细教程,需要的朋友可以参考下 ...

    脚本之家10002020-05-05