万万没想到,go的数据库操作,也能像php一样溜了
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)
相关文章
- go-dongle 0.2.7 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库
- PHP异步MySQL:提升网站性能的新方案(php异步mysql)
- 使用Go语言来操作Oracle数据库(go语言oracle)
- 环境快速搭建Linux上的PHP开发环境(Linux装php)
- 探寻Linux下PHP路径之旅(linux查看php路径)
- Linux重启PHP的命令操作指南(linux重启php命令)
- 【Linux重启PHP服务的命令指南】(linux重启php命令)
- 数据库远程连接MySQL数据库:利用PHP实现简易方法(php远程mysql)
- 初探Linux中的PHP文件之旅(linux创建php文件)
- PHP操作MySQL数据库实现排名(mysql排名php)
- PHP轻松构建高效应用——Redis实战指南(redis使用php)
- 如何在Linux上架设PHP? 25字(linux架设php)
- 用PHP操作Oracle:实现强大的数据库能力(php支持oracle)
- 数据库解决PHP连接远程MySQL数据库的问题(php连接远程mysql)
- 检测PHP对MSSQL数据库操作的能力(检测php_mssql)
- PHP连接MSSQL数据库的方法和步骤(php如何连接mssql)
- 数据从MySQL中用PHP取得数据(php 获取 mysql)
- PHP结合MySQL实现数据库事务锁定机制(php mysql 锁)
- 使用PHP编写连接MSSQL类,轻松实现数据库操作(php连接mssql 类)
- PHP程序实现MSSQL数据库的连接(php程序连接mssql)
- 用PHP从MSSQL读取数据表列表(php查询mssql列表)
- 让PHP连接MSSQL数据库的正确方式(php如何连mssql)
- 基于PHP和MSSQL的连接设置(php mssql设置)
- PHP脚本管理MSSQL数据库:优化时间精度(php mssql 时间)
- PHP简易指南:连接MySQL数据库(php连接mysql数据库)
- 新技术Go语言解析Oracle数据库日志(go解析oracle日志)
- Go语言操作Oracle数据库技术实践(go操作oracle)
- 原生PHP灵活使用Redis编写高效代码(原生php使用redis)