关于go:万万没想到go的数据库操作也能像php一样溜了

39次阅读

共计 2223 个字符,预计需要花费 6 分钟才能阅读完成。

Hi, 各位 go 的小伙伴。

很多人都是从 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 语句,不是咱不会写,要害是没必要手写啊,是吧。

全手写可能带来两个问题

  1. 某些同学对于 sql 语法可能不相熟,容易有语法错误
  2. 某些同学可能写 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)

正文完
 0