实现像php一样方便的go ORM数据库操作示例详解

 更新时间:2022年12月29日 10:21:55   作者:程序员汤汤  
这篇文章主要为大家介绍了实现像php一样方便的go ORM数据库操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用。这篇文章里,我们认真的讨论下这个问题,并且会在后面提出解决方案。

php的方便

比如你想实现一个关联查询,在php里,你只需要不断的使用箭头函数就可以了。

$users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();

以上代码,很简单实现了对一个表的查询操作,并且将查询结果以name做倒序排列,很简单

但是做同样的工作,在go里面就比较麻烦了

go的麻烦

如果你使用go的原生查询的话,你需要写如下的代码

rows, err := db.Query("select * from users where id in (?,?,?) order by name desc", 1, 2, 3)

基本上说,你需要手写一个完整的sql语句,全手动

什么!手写sql语句,不是咱不会写,关键是没必要手写啊,是吧。

全手写可能带来两个问题

  • 某些同学对于sql语法可能不熟悉,容易有语法错误
  • 某些同学可能写sql不认真,容易有拼写错误,尤其是条件多,占位符多的时候

如果你使用gorm之类的orm工具,可能会这样写

db.Where("id in (?)", []int{1,2,3}).Order("create_time desc").Find(&users)

很显然对比原生的来说,好一些,不用手写select 等关键字了,但是核心问题还是没解决,还需要手写 id in (?) 之类的。相当于之前是全手工,现在是半手工半自动了。

我这个例子里,条件就一个,在实际业务中,查询条件会有很多,并且数量还不一定,这种半自动的方法还是不太好的。

解决方案

既然有问题,那就有解决方案。很明显,最理想的方案就是保持与php的一致。那么go能做到这样吗?

答案是毫无疑问的,可以的。

这里推荐一个新的数据库操作库,可以很方便的完成这样的工作

tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)

它有一些显著的特性

  •  代码简洁,高性能
  •  支持 MySQL,MsSQL,Postgres,Sqlite3 数据库
  •  支持 空值查询
  •  支持 自动迁移
  •  支持 SQL 拼接

我们来看具体使用,就刚才的操作

aorm.Use(db).Table("users").WhereIn("id", []int{1,2,3}).OrderBy("name","desc").GetMany(&users)

对比php的写法

$users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();

不能说一模一样吧,那简直是一模一样是不是?

我们再来看看如果是查询条件不确定怎么办?

这是列表查询经常遇到的问题,前端传过来的数据数量是不一定的,我们需要根据不同的数据,来增加或者减少不同的条件,进而产生不同的sql,查询不同的结果

    var listByWhere []Person
    var where1 []builder.WhereItem
    where1 = append(where1, builder.WhereItem{Field: "type", Opt: builder.Eq, Val: 0})
    where1 = append(where1, builder.WhereItem{Field: "age", Opt: builder.In, Val: []int{18, 20}})
    where1 = append(where1, builder.WhereItem{Field: "money", Opt: builder.Between, Val: []float64{100.1, 200.9}})
    where1 = append(where1, builder.WhereItem{Field: "money", Opt: builder.Eq, Val: 100.15})
    where1 = append(where1, builder.WhereItem{Field: "name", Opt: builder.Like, Val: []string{"%", "li", "%"}})
    aorm.Use(db).Debug(true).Table("person").WhereArr(where1).GetMany(&listByWhere)
    for i := 0; i < len(listByWhere); i++ {
        fmt.Println(listByWhere[i])
    }

如上,你可以定义一个builder.WhereItem的切片(数组),然后根据前端传过来的信息,来增加和减少这个数组里的项,最后将这个查询数组,传递给aorm进行最后查询,最终得到结果。

由上面的例子可以看出,和PHP一样,你只是需要输入关键的字段名,关键的数据这就行了,其他的sql关键字,以及多种条件的拼接,aorm库自动帮你完成了。完美解决语法错误问题,以及拼写错误问题。

怎么样,香不香?

写在最后

aorm库非常的好用,为go工程师带来了php一般的开发体验,推荐各位快快用起来。

tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)

以上就是实现像php一样方便的go ORM数据库操作示例详解的详细内容,更多关于go ORM数据库操作的资料请关注脚本之家其它相关文章!

相关文章

  • go 生成器模式的具体使用

    go 生成器模式的具体使用

    生成器是一种创建型设计模式,使你能够分步骤创建复杂对象,本文主要介绍了go生成器模式的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 浅谈Go语言的error类型

    浅谈Go语言的error类型

    这篇文章主要介绍了浅谈Go语言的error类型,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言的数据结构转JSON

    Go语言的数据结构转JSON

    本文主要介绍了Go语言的数据结构转JSON,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Golang IPv4 字符串与整数互转方式

    Golang IPv4 字符串与整数互转方式

    这篇文章主要介绍了Golang IPv4 字符串与整数互转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • go defer避坑指南之拆解延迟语句

    go defer避坑指南之拆解延迟语句

    这篇文章主要为大家详细介绍了go defer避坑指南之如何拆解延迟语句,掌握正确使用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • Golang内存模型教科书级讲解

    Golang内存模型教科书级讲解

    go官方介绍go内存模型的时候说:探究在什么条件下,goroutine 在读取一个变量的值的时,能够看到其它 goroutine 对这个变量进行的写的结果,Go内存模型规定了一些条件,在这些条件下,在一个goroutine中读取变量返回的值能够确保是另一个goroutine中对该变量写入的值
    2023-03-03
  • Go语言将string解析为time.Time时两种常见报错

    Go语言将string解析为time.Time时两种常见报错

    本文主要介绍了Go语言将string解析为time.Time时两种常见报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang监听日志文件并发送到kafka中

    Golang监听日志文件并发送到kafka中

    这篇文章主要介绍了Golang监听日志文件并发送到kafka中,日志收集项目的准备中,本文主要讲的是利用golang的tail库,监听日志文件的变动,将日志信息发送到kafka中 ,需要的朋友可以参考一下
    2022-04-04
  • 简单讲解Go程序中使用MySQL的方法

    简单讲解Go程序中使用MySQL的方法

    这篇文章主要介绍了Go程序中使用MySQL的方法,需要使用第三方包来进行连接,需要的朋友可以参考下
    2015-10-10
  • Golang实现自己的Redis(TCP篇)实例探究

    Golang实现自己的Redis(TCP篇)实例探究

    这篇文章主要介绍了Golang实现自己的Redis(TCP篇)实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论