acmestack / gorm-plus

Gorm-plus是基于Gorm的增强版,类似Mybatis-plus语法。Gorm-plus is based on an enhanced version of Gorm, similar to Mybatis-plus syntax.
https://github.com/acmestack/gorm-plus/wiki
Apache License 2.0
276 stars 41 forks source link

分页查询只有单个列执行查询 在查询SelectCount总数会报错,因为gorm里count处理在mysql会有问题 #68

Closed bingtianyiyan closed 12 months ago

bingtianyiyan commented 12 months ago

gorm对count的执行如果包含distinct 或者列别名会执行报错在mysql,我找了相应的issue :https://github.com/go-gorm/gorm/issues/5821

我的用法:

1694510071205

报错的地方: func SelectCount[T any](q QueryCond[T], opts ...OptionFunc) (int64, gorm.DB) { var count int64 resultDb := buildCondition(q, opts...) resultDb.Count(&count) //这里执行会生成sql不正确 return count, resultDb }

sql生成比方说是生成这样的:SELECT COUNT(Id as id) FROM t_test 这种语法在mysql执行是报错的, 因为gorm里对count逻辑:

1694507712408

所以在不用到类似distinct什么情况下,所有sql一律生成 select count() from t_test ,不考虑复杂情况 所以我的解决方案我是想在这边执行Count的时候加个resultDb.Statement.Selects = nil // SelectCount 根据条件查询记录数量 func SelectCount[T any](q QueryCond[T], opts ...OptionFunc) (int64, *gorm.DB) { var count int64 resultDb := buildCondition(q, opts...) //fix 查询分页数量有列Select只有一个则生成sql不对问题 resultDb.Statement.Selects = nil resultDb.Count(&count) return count, resultDb }

这种感觉也是组件gorm的问题~~~~对各个驱动并没有完全匹配 主要我用的使用列别名转了,如果单个字段,列别名不转的话没有问题,在gorm执行count的时候select count(fieldName) from 表 这样sql执行是正确的。不过总体上gorm的count兼容问题?

afumu commented 12 months ago

分析的非常好,如果你感兴趣的话,欢迎你提交pr哈

bingtianyiyan commented 12 months ago

分析的非常好,如果你感兴趣的话,欢迎你提交pr哈 我已经提交pr了哈,你看下,然后把自己之前项目增加的cond条件拼接也加进去了

afumu commented 12 months ago

分析的非常好,如果你感兴趣的话,欢迎你提交pr哈 我已经提交pr了哈,你看下,然后把自己之前项目增加的cond条件拼接也加进去了

在pr下面回复一下 I have read the CLA Document and I hereby sign the CLA 签一下cla