go-xorm / xorm

Simple and Powerful ORM for Go, support mysql,postgres,tidb,sqlite3,mssql,oracle, Moved to https://gitea.com/xorm/xorm
BSD 3-Clause "New" or "Revised" License
6.67k stars 754 forks source link

limitN = 0 的时候,相当于没有限制。 #1117

Open xbcbupt725 opened 6 years ago

xbcbupt725 commented 6 years ago

if session.statement.LimitN > 0 { orderSQL += fmt.Sprintf(" LIMIT %d", session.statement.LimitN) }

这里 select * from xxx limit 0 原本是查询0个。但是通过xorm去limit相当于没有限制。

yifhao commented 6 years ago

超大的问题

lunny commented 6 years ago

Limit 0 有什么意义吗?

xbcbupt725 commented 6 years ago

Limit 0 有什么意义吗?

就说说我的遭遇,我搞了某个后台定时任务,通过配置文件就控制LimitN。一开始不希望任务执行,设置LimitN = 0。结果就······

BetaCat0 commented 6 years ago

在 golang 中,由于零值的原因,在逻辑判断中不能很好的判断这个 0 究竟是系统初始值抑或是用户有意为之(因此在框架中我们当作“未给出限制”来处理)。建议“不希望任务执行”这种行为由开关来控制,而不是用一些特殊值来进行一些tricky的操作:这样会降低代码的可读性,并且对框架的功能特性产生强依赖。希望建议对您有用 :)

yifhao commented 6 years ago

在 golang 中,由于零值的原因,在逻辑判断中不能很好的判断这个 0 究竟是系统初始值抑或是用户有意为之(因此在框架中我们当作“未给出限制”来处理)。建议“不希望任务执行”这种行为由开关来控制,而不是用一些特殊值来进行一些tricky的操作:这样会降低代码的可读性,并且对框架的功能特性产生强依赖。希望建议对您有用 :)

可以把Statement中的LimitN改为*int, 不是nil的话, 就表示设置了.nil的话, 表示没有设置.

lunny commented 6 years ago

@xbcbupt725 自己加个if啊,为0时性能还更好,至少不用请求数据库。 @Frank-Hust 嗯。这个可以通过改造Limit()函数来解决,关键看是否有那个必要。

BetaCat0 commented 6 years ago

在 golang 中,由于零值的原因,在逻辑判断中不能很好的判断这个 0 究竟是系统初始值抑或是用户有意为之(因此在框架中我们当作“未给出限制”来处理)。建议“不希望任务执行”这种行为由开关来控制,而不是用一些特殊值来进行一些tricky的操作:这样会降低代码的可读性,并且对框架的功能特性产生强依赖。希望建议对您有用 :)

可以把Statement中的LimitN改为*int, 不是nil的话, 就表示设置了.nil的话, 表示没有设置.

因为 golang 不可以直接取基本元素的字面量引用,这样反而会让编码更加麻烦,而且0的话,其实已经可以在外层控制的

yifhao commented 5 years ago

很多时候比如翻页,是前端传过来的参数,写代码的人只对了最大值做限制,而没有对0判断,原本以为会是limit 0,结果现在把所有数据都查一遍了