Hi,各位go的小伙伴。

很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm相同好用。这篇文章里,我们仔细的讨论下这个问题,而且会在后面提出处理计划。

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

php的便利

比如你想完结一个关联查询,在php里,你只需求不断的运用箭头函数就能够了。

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

以上代码,很简单完结了对一个表的查询操作,而且将查询成果以name做倒序摆放,很简单

可是做相同的作业,在go里面就比较麻烦了

go的麻烦

假如你运用go的原生查询的话,你需求写如下的代码

rows,err:=db.Query("select*fromuserswhereidin(?,?,?) 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)

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