首页 > 数据库 >go 下的查询数据库的框架 ORM框架:访问mysql数据库

go 下的查询数据库的框架 ORM框架:访问mysql数据库

时间:2023-03-02 11:33:16浏览次数:63  
标签:users 框架 builder ORM 查询数据库 go php where1 name

运维的基友 习惯使用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语句,不是咱不会写,关键是没必要手写啊,是吧。

全手写可能带来两个问题

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

 

它有一些显著的特性

 

  1. 代码简洁,高性能
  2. 支持 MySQL,MsSQL,Postgres,Sqlite3 数据库
  3. 支持 空值查询
  4. 支持 自动迁移
  5. 支持 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

 

标签:users,框架,builder,ORM,查询数据库,go,php,where1,name
From: https://www.cnblogs.com/yjc53/p/17171206.html

相关文章

  • 如何用GORM向MySQL插入带有emoji
    最开始因为我根据网上的GORM连接MySQL教程,所以在代码中charset参数是写死的,如下:fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",a,b,c,d)......
  • error MSB8020: The build tools for v142 (Platform Toolset = 'v142') cannot be fo
    多个VS版本编译报错:错误1errorMSB8020:Thebuildtoolsforv142(PlatformToolset='v142')cannotbefound.Tobuildusingthev142buildtools,pleaseinst......
  • 分布式系统框架
    HadoopModelHadoopCommon基础型功能HadoopDistributedFileSystem负责存放数据YARN负责资源的调配MapReduce大数据的计算框架Ozone数据存放到仓......
  • 框架串讲四
    SpringBootSpringBoot提供了哪些核心功能?起步依赖自动配置jar包快速启动SpringBoot核心注解是什么?由哪几个注解组成?@SpringBootApplication @SpringBootConfi......
  • Cesium Transform(二十)
    cesium是一个用于创建3D地球和空间场景的JavaScript库,它提供了一些用于坐标变换的类,统称为transform。transform类可以帮助我们在不同的参考系之间转换点或向量,例如从地球......
  • 【Winform】禁用控件但不变灰
    https://blog.csdn.net/Cool2Feel/article/details/81018722[System.Runtime.InteropServices.DllImport("user32.dll")]publicstaticexternintSe......
  • 模拟浏览器与服务器交互(简易TomCat框架)
    模拟浏览器发送请求到服务器获取资源的思想和代码实现浏览器发送请求到服务器获取资源的流程和概念日常我们使用的浏览器,底层都是帮我们做了很多事情,我们只需要用,比如......
  • SSM框架整合
    SSM框架整合1.环境要求环境要求IDEAMysqlTomcatMaven2.数据库环境创建存放数据的数据库以及数据库表例子:创建一个存放书籍数据的数据库和数据库表CREATEDATAB......
  • 韦东山2440-学习笔记-platform
    1.简介platform是设备驱动总线模型2.示例#include<linux/platform_device.h>#include<linux/module.h>staticstructplatform_device*led_dev;staticstru......
  • 前端框架vue中的v-on和v-bind的区别
    1.v-on指令监听DOM事件,并在触发时运行一些JavaScript代码"v-on:"的语法糖为"@",语法糖就是简写的意思。例如:<!--事件处理函数--><divid="app"> <!--语法:v-on:事......