ruby find_by_sql 字符串参数将 int 参数转换为字符串在限制中引发错误 mysql 8
ruby find_by_sql string parameters converting int parameter into string throws error in limit mysql 8
我在 rails Rails 7.0.2.2 webapp(ruby 版本 3.0.3)上有一个 ruby,查询 mysql 8.0。 x86_64 数据库上的 macos10.14 为 18,如:
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
我在 rails Rails 7.0.2.2 webapp(ruby 版本 3.0.3)上有一个 ruby,查询 mysql 8.0。 x86_64 数据库上的 macos10.14 为 18,如:
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