Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

field.Field 缺失运算方法 #1202

Open
shuqingzai opened this issue Sep 3, 2024 · 8 comments
Open

field.Field 缺失运算方法 #1202

shuqingzai opened this issue Sep 3, 2024 · 8 comments

Comments

@shuqingzai
Copy link

GORM Playground Link

Description

field.Field 中有求和方法,缺失一些方法

  1. 运算方法
  2. Between 相关

参考:

  1. field:
    func (field Field) Sum() Field {
  2. int:

    gen/field/int.go

    Lines 70 to 98 in ebb6364

    // Add ...
    func (field Int) Add(value int) Int {
    return Int{field.add(value)}
    }
    // Sub ...
    func (field Int) Sub(value int) Int {
    return Int{field.sub(value)}
    }
    // Mul ...
    func (field Int) Mul(value int) Int {
    return Int{field.mul(value)}
    }
    // Div ...
    func (field Int) Div(value int) Int {
    return Int{field.div(value)}
    }
    // Mod ...
    func (field Int) Mod(value int) Int {
    return Int{field.mod(value)}
    }
    // FloorDiv ...
    func (field Int) FloorDiv(value int) Int {
    return Int{field.floorDiv(value)}
    }

field.Field 应该与其它类型保持同样的方法,以便支持自定义类型

如:使用 decimal.Decimal 作为金额字段类型时,无法运算,自增或自减

UPDATE `user_wallet` SET `frozenBalance` = `frozenBalance` + 10.05 WHERE userId = 311 AND balance > `frozenBalance` + 10.05;
@qqxhb
Copy link
Member

qqxhb commented Sep 3, 2024

如果确定是数值运算,可以把这个字段gen field类型定义成float,或者int

@shuqingzai
Copy link
Author

shuqingzai commented Sep 4, 2024

如果确定是数值运算,可以把这个字段gen field类型定义成float,或者int

@qqxhb 你的建议值得商榷

  1. 如果数据库已经使用 decimal ,并且涉及一些金额相关的字段,那么你的建议就毫无意义
  2. 对于自定义类型有 sum 却没有其它计算方法也不合理,对应 go 使用 decimal 业界一般都是使用 decimal.Decimal
  3. 虽然 intfloat 有一些计算方法,但是有 sum 没有 avgmaxmin 一类常用的计算方法也是值得商榷的

@shuqingzai
Copy link
Author

shuqingzai commented Sep 4, 2024

如果确定是数值运算,可以把这个字段gen field类型定义成float,或者int

@qqxhb 你的建议值得商榷

  1. 如果数据库已经使用 decimal ,并且涉及一些金额相关的字段,那么你的建议就毫无意义
  2. 对于自定义类型有 sum 却没有其它计算方法也不合理,对应 go 使用 decimal 业界一般都是使用 decimal.Decimal
  3. 虽然 intfloat 有一些计算方法,但是有 sum 没有 avgmaxmin 一类常用的计算方法也是值得商榷的

@qqxhb 抱歉,我没有仔细阅读代码,avg 等几个参数在 expr 内嵌,但是其他几个点我认为还是值得考虑

@shuqingzai
Copy link
Author

UPDATE `user_wallet` SET `frozenBalance` = `frozenBalance` + 10.05 WHERE userId = 311 AND balance > `frozenBalance` + 10.05;

@qqxhb 请问按目前的功能实现,我该如何构建下面的 SQL ??

UPDATE `user_wallet` SET `frozenBalance` = `frozenBalance` + 10.05 WHERE userId = 311 AND balance > `frozenBalance` + 10.05;

@qqxhb
Copy link
Member

qqxhb commented Sep 4, 2024

model上的类型用decimal.Decimal就好
只是改dal上的类型

自定义Filed是否要加这些方法,我们讨论下

@mimicode
Copy link

not in 也没有,既然是通用类型的 filed.Field 没有确定类型,应该加上相关方法,有开发者自己决定 用还是不用。不能因为可能会出现误用 而禁止。如果有人认为这样不安全,你可以用更准确的类型,比如field.Int.

@Catlickfish
Copy link

@shuqingzai 请问你解决这个问题了吗?能否展示下示例代码呢

@shuqingzai
Copy link
Author

shuqingzai commented Oct 17, 2024

@shuqingzai 请问你解决这个问题了吗?能否展示下示例代码呢

@Catlickfish
fork 仓库,自己加方法呗,然后 replace go.mod 的仓库指向

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants