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

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

时间:2022-12-27 11:36:04浏览次数:73  
标签:users 数据库 查询 go php where1 builder

Hi,各位go的小伙伴。

很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用。这篇文章里,我们认真的讨论下这个问题,并且会在后面提出解决方案。

万万没想到,go的数据库操作,也能像php一样溜了_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 * 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 (?)
之类的。相当于之前是全手工,现在是半手工半自动了。

我这个例子里,条件就一个,在实际业务中,查询条件会有很多,并且数量还不一定,这种半自动的方法还是不太好的。

解决方案

既然有问题,那就有解决方案。很明显,最理想的方案就是保持与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一样溜了_数据库_02

标签:users,数据库,查询,go,php,where1,builder
From: https://blog.51cto.com/u_12739514/5971845

相关文章

  • beego阅读源码走通数据库的初始化
    一般初始化数据库会在main的运行的时候第一步进行,常用的方式dbhost:=beego.AppConfig.String("dbhost")dbport:=beego.AppConfig.String("dbport")dbu......
  • MongoDB
      MongoDB是一个基于分布式文件存储的数据库。旨在为WEB应用提供可扩展的高性能数据存储解决方案。  MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系......
  • 实践GoF的23种设计模式:命令模式
    摘要:命令模式可将请求转换为一个包含与请求相关的所有信息的对象,它能将请求参数化、延迟执行、实现Undo/Redo操作等。本文分享自华为云社区《【Go实现】实践GoF的23......
  • My SQL数据库ZIP包安装方法
    安装情况说明:1,MySQLCommunityServer是免费使用的,记录的是ZIP包方式配置安装的形式。2,安装环境Window10/1164位。3,数据库下载地址:MySqlDownLoad安装步骤:1,解......
  • Mysql到TiDB迁移,双写数据库兜底方案
    作者:京东零售石磊TiDB作为开源NewSQL数据库的典型代表之一,同样支持SQL,支持事务ACID特性。在通讯协议上,TiDB选择与MySQL完全兼容,并尽可能兼容MySQL的语法。因此,......
  • 万万没想到,go的数据库操作,也能像php一样溜了
    Hi,各位go的小伙伴。很多人都是从php转过来的吧,不知道你们有没有发现,go界的orm并没有像php的orm一样好用。这篇文章里,我们认真的讨论下这个问题,并且会在后面提出解决方案......
  • python连接mysql数据库(2)——批量插入数据
      1、需要插入多条数据,一天一条,time的格式为yyyy-mm-dd00:00:00使用pandas插件包,取某一段时间的日粒度,然后进行日期格式化,使用strftime   2、每条开头有唯......
  • MySQL数据库视图:视图定义、创建视图、修改视图
    视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和......
  • 将mysql数据库批量导出为word三线表格形式
    1、更换字体和字体大小BaseFontbfComic0=BaseFont.createFont("C:\\Windows\\Fonts\\simsunb.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);Fontfont=newF......
  • 数据库主从
    1mysql主从搭建#项目只有一个数据库服务端-无论写还是读,请求都压在这个mysql服务器上-连接数过高,mysql顶不住-假设做成两台,一台只用来写数据,另一台用来......