优秀的编程知识分享平台

网站首页 > 技术文章 正文

go ent orm 实践1-实现select distinct

nanyue 2024-10-20 07:42:39 技术文章 6 ℃

今天介绍一下,在go里,如何使用ent这个orm框架,实现select distinct的查询。相关文档里比较少记载,所以在此描述一下,方便有需要的人借鉴。

假设有个支出表pay_fees,里面有收款人receiver字段,现在想查询唯一的收款人信息,使用sql查询的话,就是:

select distinct receiver from pay_fees;

在go ent里的话,实现代码大概如下:

client := EntClient(ctx, data)
receivers := client.PayFee.Query().
Where(pres...).
Unique(true).
Select(payfee.FieldReceiver).
StringsX(ctx)

注意Unique要放在Where的后面,StringsX直接返回结果数组。

上面是查询一个字段的情况,如果要查询多个字段怎办呢,比如说要查询费用名称、收款人的唯一信息,这个时候就要定义一个结构体数组,采用ScanX函数,代码可以这样写:

var ns []struct {
		FeeName string
		Receiver  string
}
client := EntClient(ctx, data)
client.PayFee.Query().
Where(pres...).
Unique(true).
Select(payfee.FieldFeeName,
       payfee.FieldReceiver).
ScanX(ctx,&ns)

其实简单起见,可以直接把distinct查询结果,Scan到ent实体对象数组里,这样的好处是可以不用另定义结构体对象数组。代码如下:

client := EntClient(ctx, data)
var pfs []*ent.PayFee
client.PayFee.Query().
Where(pres...).
Unique(true).
Select(payfee.FieldFeeName,
       payfee.FieldReceiver).
ScanX(ctx,&pfs)

这样直接通过迭代pfs这个对象数组,就可以获取查询结果了。

这次分享就到这里了,希望能帮到大家。

最近发表
标签列表