gpt4 book ai didi

mysql - ruby find_by_sql 字符串参数将 int 参数转换为字符串在限制 mysql 8 中抛出错误

转载 作者:行者123 更新时间:2023-12-05 05:43:52 25 4
gpt4 key购买 nike

我有一个 ruby​​ on rails Rails 7.0.2.2 webapp(ruby 版本 3.0.3),在 x86_64 数据库上查询 mysql 8.0.18 for macos10.14,如:

pagIndex = params[:pagIndex].to_i
limitBoats = 20
offset = pagIndex * 20
values = Array.new
indexValues = 0

sQuery = "SELECT DISTINCT b.id, ... FROM ... WHERE ... LIMIT ? OFFSET ?"

values.insert(indexValues + 1, limitBoats)
values.insert(indexValues + 2, offset)
values.shift
values.insert(0, sQuery)
@result = Entity.find_by_sql(values)

此代码运行良好,它转换为如下查询:

SELECT ... LIMIT '20' OFFSET '0';

其中 limit 和 offset 是字符串。

多年来,这在我之前的 ruby​​ 2.4、rails 4 和 mysql 5.5 中一直运行良好。然而,在迁移到 ruby​​ 3、Rails 7 和 mysql 8 之后,我在 limit 和 offset 参数中遇到错误,因为 mysql 需要一个整数。

如果我只删除 '',查询就可以工作。我怎样才能使它与 find_by_sql 一起工作?

我想我遗漏了一些东西,因为我什至没有发现任何其他类似的问题。

注意:limit 和 offset 是分页的一部分,因此它们来自变量,我不能只将这些值用作常量整数。

更新根据@muistooshort 的评论,只是为了更容易调试,如果我只是创建一个方法:

@result = Entity.find_by_sql(['select * from entity limit ?', 11])
logger.debug "Entities=" + @result.inspect

我得到这个输出:

DEBUG -- :   Entity Load (0.5ms)  select * from boats limit '11'
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.5ms | Allocations: 324)



ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''11'' at line 1):

如您所见,它将 int 更改为 string 并且 mysql 8 会报错。

最佳答案

对我来说完全陌生,但我在 Rails 中制造了下一个错误: https://github.com/rails/rails/issues/44853

他们回答说他们需要故意这样做,所以现在使用带限制的 find_by_sql 发送查询的唯一方法是使用此处定义的解决方法: https://github.com/rails/rails/issues/44312

关于mysql - ruby find_by_sql 字符串参数将 int 参数转换为字符串在限制 mysql 8 中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71727983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com