2 minutes reading time
最近在开发的时候,需要进行数据库计算,主要是根据表中的某些字段进行汇总计算,但由于数据库表中已有同名字段名,ent 不会使用计算后的指标,默认使用schema中定义的字段,导致无法返回正确的结果。
针对这种情况,我能想到的方法有2种: 1) 不使用同名的字段名 2) 查找ent是否有相关的解决方案。
这里我采用了第二种方法,查找相关的issues, 通过查找相关issue,找到了相关的解决方案: ent 的 sql/modifier 特性。
定义一个新的数据库表结构,结构如下:
func () []ent.Field
page_views_rpm 字段是由 estimated_earnings 和 page_views 计算而来。
编写相应的查询代码:
package main
import (
"context"
"entgo.io/ent/dialect/sql"
"fmt"
_ "github.com/lib/pq"
"log"
"modifier-demo/ent"
"modifier-demo/ent/ad"
"time"
)
type Ads struct
func main()
主要是根据date来汇总并重新计算 page_views_rpm 字段,运行代码后发现没有成功输出,打印后发现ent使用了旧的PageViewsRpm字段进行排序,导致sql无法顺利运行。
SELECT "ads"."date",
CAST(COALESCE(SUM(estimated_earnings) / NULLIF(SUM(page_views) * 1.0, 0.0) * 1000,
0) AS numeric(10,2)) AS "page_views_rpm"
FROM "ads"
GROUP BY "ads"."date"
ORDER BY "ads"."page_views_rpm"
这里可以使用 ent 的 feature sql/modifier 来解决,我们先在 generate.go 开启特性 --feature sql/modifier,然后重新生成代码,使用Modify方法添加自定义修饰符即可,相应的代码如下:
err = client.Debug().Ad.Query().Modify(func(s *sql.Selector) ).Scan(context.TODO(), &a)
if err != nil
运行修改后的代码,结果顺利输出,相应的sql如下:
SELECT CAST(COALESCE(SUM(estimated_earnings) / NULLIF(SUM(page_views) * 1.0, 0.0) * 1000,
0) AS numeric(10, 2)) AS "page_views_rpm"
FROM "ads"
GROUP BY "date"
ORDER BY "page_views_rpm"