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 语句,不是咱不会写,要害是没必要手写啊,是吧。
全手写可能带来两个问题
- 某些同学对于 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)