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

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

服务器之家 - 脚本之家 - Golang - 实现像php一样方便的go ORM数据库操作示例详解

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

2022-12-30 15:42程序员汤汤 Golang

这篇文章主要为大家介绍了实现像php一样方便的go ORM数据库操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

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

php的方便

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

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

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

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

go的麻烦

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

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

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

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

全手写可能带来两个问题

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

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

?
1
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 拼接

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

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

对比php的写法

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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数据库操作的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7181654898805571643

延伸 · 阅读

精彩推荐
  • Golang解析Go语言编程中的struct结构

    解析Go语言编程中的struct结构

    这篇文章主要介绍了Go语言编程中的struct结构,是Go语言入门学习中的基础知识,需要的朋友可以参考下 ...

    脚本之家2932020-04-27
  • GolangGo素数筛选分析详解

    Go素数筛选分析详解

    学习Go语言的过程中,遇到素数筛选的问题。这是一个经典的并发编程问题,是某大佬的代码,短短几行代码就实现了素数筛选,这篇文章主要介绍了Go素数...

    happyfuns8652022-11-29
  • GolangGo语言实现顺序存储的线性表实例

    Go语言实现顺序存储的线性表实例

    这篇文章主要介绍了Go语言实现顺序存储的线性表的方法,实例分析了Go语言实现线性表的定义、插入、删除元素等的使用技巧,具有一定参考借鉴价值,需要的...

    OSC首席键客2932020-04-22
  • Golang深入Golang的接口interface

    深入Golang的接口interface

    这篇文章主要介绍了深入Golang的接口interface,go不要求类型显示地声明实现了哪个接口,只要实现了相关的方法即可,编译器就能检测到,接下来关于接口...

    ​谈笑风生间11792022-10-14
  • GolangGolang算法之田忌赛马问题实现方法分析

    Golang算法之田忌赛马问题实现方法分析

    这篇文章主要介绍了Golang算法之田忌赛马问题实现方法,结合具体实例形式分析了基于Go语言的田忌赛马问题原理与算法实现技巧,需要的朋友可以参考下 ...

    books19582142020-05-05
  • Golanggo语言基础语法示例

    go语言基础语法示例

    这篇文章主要介绍了go语言基础语法示例,介绍了go语言较为全面的基础知识,具有一定参考价值,需要的可以了解下。 ...

    冬叶''s blog3822020-05-11
  • Golang解决golang在import自己的包报错的问题

    解决golang在import自己的包报错的问题

    这篇文章主要介绍了解决golang在import自己的包报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    igoodful6682021-06-08
  • Golang详解go语言单链表及其常用方法的实现

    详解go语言单链表及其常用方法的实现

    这篇文章主要介绍了详解go语言单链表及其常用方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    Zppj6792021-02-07