当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 20:29:24 PHP

大家好go的朋友们。很多人都是从php转过来的。不知道大家有没有发现,go世界里的orm不如php里的orm好用。在这篇文章中,我们将认真讨论这个问题,并在后面提出解决方案。php的方便性比如你要实现一个相关的查询,在php中,只需要不断的使用箭头函数即可。$users=DB::table('users')->whereIn('id',[1,2,3])->orderBy('name','desc')->get();上面的代码很简单的实现了对一张表的查询操作,将查询结果按名称倒序排序。很简单,但是用Go做同样的工作比较麻烦。如果使用Go的原生查询,需要写如下代码rows,err:=db.Query("select*fromuserswhereidin(?,?,?)orderbynamedesc",1,2,3)基本上,你需要手写一个完整的sql语句,全是手工活!不是不能手写sql语句,关键是没必要手写吧?全手写可能会带来两个问题。有些同学可能对sql语法不熟悉,很容易出现语法错误。gorm等orm工具可能会这样写db.Where("idin(?)",[]int{1,2,3}).Order("create_timedesc").Find(&users)明显对比本来就是更好,不用手写select之类的关键字,但是核心问题还是没有解决,需要手写idin(?)之类的。相当于以前是全手动,现在是半手动半自动。在我的示例中,只有一个条件。实际业务中,查询条件会很多,数量也不一定。这种半自动方法不是很好。解决方案如果有问题,就会有解决方案。显然,理想的解决方案是与php保持一致。那么可以去做这个吗?答案毫无疑问,是的。这里推荐一个新的数据库操作库,可以轻松完成这样的工作tangpanqing/aorm:OperateDatabaseSoEasyForGoLangDeveloper(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('名称','desc')->get();不能说一模一样,就是一模一样,不是吗?我们来看看如果查询条件不确定怎么办?这是列表查询中经常遇到的问题。前端传来的数据量是不确定的。我们需要根据不同的数据增减不同的条件,然后生成不同的SQL,查询不同的结果。varlistByWhere[]Personvarwhere1[]builder.WhereItemwhere1=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}})其中1=append(where1,builder.WhereItem{Field:"money",Opt:builder.Eq,Val:100.15})where1=append(where1,builder.WhereItem{Field:"name",选择:builder.Like,Val:[]string{"%","li","%"}})aorm.Use(db).Debug(true).Table("person").WhereArr(where1).GetMany(&listByWhere)fori:=0;我