go 下的查询数据库的框架 ORM框架:访问mysql数据库
运维的基友 习惯使用python了,学习go的时候是不是被gorm 恶心死了

例如python flask 框架下的orm那么好用简单 ,或者号称 世界上最好用的语言php的同学们也是非常的苦恼呢
很多人都是从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 (?)
之类的。相当于之前是全手工,现在是半手工半自动了。
python falsk sqlalchemy 的方便
param=[]
param.append(users.name == name)
data = Project.query.filter(and_(*param).all()
我上述例子里,条件就一个,在实际业务中,查询条件会有很多,并且数量还不一定,这种半自动的方法还是不太好的。
解决方案
既然有问题,那就有解决方案。很明显,最理想的方案就是保持与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一般的开发体验(其实和python下的sqlalerchmy 也很相似),推荐各位快快用起来。
tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)
新老用户特惠 个人开发者专项云主机 不容错过哦
https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=faua7p9t
go 下的查询数据库的框架 ORM框架:访问mysql数据库的更多相关文章
- Android开发数据库之第三方ORM框架(GreenDao)
移动APP追求追求功能实现的同一时候,用户体验很重要.開始APP的同一时候.要时刻的切换开发人员的角色,如你开发的时候.是 站在APP的开发角色,处于生产者的位置:当你測试的时候.你应该把自己放在用户 ...
- Linux下C++访问MySQL数据库
由于想要开始了解并学习用LAMP进行web开发,所以昨晚我在Fedora上安装了MySQL,学习了MySQL的几个常用命令.想着在学习进行web开发(PHP访问数据库)之前,先用我熟悉的C++连接数据 ...
- Web框架之Django-20-基于mysql数据库的连接
Web框架之Django-20-基于mysql数据库的连接 想要连接mysql首先需要安装pymysql这个驱动 然后在app的init文件中引入驱动 import pymysql pym ...
- ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据
ABP默认的数据库是SQLServer,不过ABP框架底层是EF框架,因此也是很容易支持其他类型的数据库的,本篇随笔介绍在ABP框架使用Mysql数据库,以及基于SQLServer创建MySql数据库 ...
- 【Linux】Ubuntu下C语言访问MySQL数据库入门
使用的系统是Ubuntu 11.10.数据库是MySQL. MySQL数据库环境配置 首先需要安装MySQL客户端和服务器,命令行安装方式为: sudo apt-get install mysql-s ...
- C#访问MySQL数据库(winform+EF)
原文:C#访问MySQL数据库(winform+EF) 以前都是C#连接SQLServer,现在MySQL也比较火了,而且是开源跨平台的,这里连接使用一下,主要是体会一下整个流程,这里使用的是winf ...
- C#连接、访问MySQL数据库
一.准备工具 visual stuido(本示例使用visual studio 2010) MySql.Data.dll mysql_installer_community_V5.6.21.1_set ...
- Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...
- 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)
一.初识MySQL数据库 ###<1>数据库概述 1. 数据库 长期存储在计算机内的,由组织的可共享的数据集合 存储数据的仓库 文件 ...
- MySQL入门很简单: 15 java访问MySQL数据库
1. 连接数据库 1.1 下载安装驱动 java通过JDBC(Java Database Connectivity,Java数据库连接)来访问MySQL数据库.JDBC的编程接口提供的接口和类与MyS ...
随机推荐
- 数据库实践丨使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题
摘要:用户使用Mogdb 2.0.1版本进行业务上线测试,发现在插入数据时,应用日志中提示primary key冲突,用户自查业务SQL没有问题,接到通知后,招手处理故障. 本文分享自华为云社区< ...
- MySQL union 和 order by 同时使用
目录 一.出现错误的情况 二.解决上述问题的两种方法 三.案例分析: 求解: 常见的错误解法 (1)使用 union 和 多个order by 不加括号 [报错] (2)order by 在 unio ...
- 关于v-deep有你想知道的一切
1.首先要知道v-deep的使用场合. 在此之前先了解一下scoped属性,scoped 属性是一个布尔属性.如果使用该属性,则样式仅仅应用到 style 元素的父元素及其子元素. 在vue中引入了s ...
- (原创)【B4A】一步一步入门01:简介、开发环境搭建、HelloWorld
一.前言 作者注:絮絮叨叨,可跳过不看. 一直有开发跨平台软件的需求.因为我的主力是C# ,所以当MAUI出现后,我欣喜若狂的开始学习研究.但是经历了两个月左右的时间,我弃坑了,我发现MAUI不是我能 ...
- day16-声明式事务-02
声明式事务-02 3.事务的传播机制 事务的传播机制说明: 当有多个事务处理并存时,如何控制? 比如用户去购买两次商品(使用不同的方法),每个方法都是一个事务,那么如何控制呢? 也就是说,某个方法本身 ...
- Kubernetes(k8s)配置文件管理:ConfigMap
目录 一.系统环境 二.前言 三.ConfigMap概览 四.创建ConfigMap 五.ConfigMap的使用 5.1 以环境变量的方式使用ConfigMap 5.2 以卷的方式使用ConfigM ...
- 基于NOSTR协议的“公有制”版本的Twitter,去中心化社交软件Damus用后感,一个极端走向另一个极端
最近,一个幽灵,Web3的幽灵,在网络游荡,它叫Damus,这玩意诠释了什么叫做病毒式营销,滑稽的是,一个Web3产品却在Web2的产品链上疯狂传销,各方大佬纷纷为其背书,到底发生了什么?Damus的 ...
- k210 cpu、asm、rust、smpboot、ipi
介绍 k210的datasheet主要讲了与外设相关的内容,k210并不支持最新的完整的riscv指令集,而是实现了一部分.本文想要通过汇编来一点点摸索k210的寄存器,布局,mmu,缓存等结构 相关 ...
- log4j 完美版配置
百度的LOG4J配置记录一下 目前无时间阅读,反正能用就行了 # priority :debug<info<warn<error #you cannot specify every ...
- 如何优化线上WebAssembly
如何优化线上WebAssembly WebAssembly部署使用 HTTPS : 为什么?我可以通过一个案例查看 ,下面我们会通过masa docs站点进行测试 打开 http://docs.mas ...