gpt4 book ai didi

ruby - 使用 ActiveRecord 在查询对象中转义参数?

转载 作者:数据小太阳 更新时间:2023-10-29 06:31:12 24 4
gpt4 key购买 nike

给定一个查询对象(不是 AR 模型)

class ComplexQuery
QUERY = <<-SQL
...
SQL

def new(param1, param2)
...
end

def execute
# format and interpolate parameters into QUERY
# pass finished SQL to `execute` or `select_all`
end
end

如何方便地转义所有参数?

我成功地使用了三种技术,但没有一种是方便的。

  1. 使用 raw_connection(对我而言)返回 PG::Conn 的实例并调用 exec_params。我对此并不满意,因为 exec_params 需要一组详细的参数来指定数据类型。
  2. 在我的查询对象中包含 ActiveRecord::Sanitization 并使用其中一种方便的方法,例如 replace_named_bind_variables。我对此不满意,因为 replace_named_bind_variablesprotected 并且我必须使用 send
  3. 改为编写一个模块。出于某种原因,当我 include ActiveRecord::Sanitization 到模块中时,我能够使用其 protected 方法。我对此不满意,因为有时我想实例化我的查询对象而不执行它,例如用于测试。

ActiveRecord::Sanitization 包含到 class 中感觉是最好的解决方案,但我一定做错了什么,因为我应该能够使用 protected 方法。

我正在寻找一种解决方案:

  1. 转义多个参数
  2. 旨在供 ActiveRecord 的消费者使用
  3. 推断参数的数据类型并相应地格式化

我找到了一些相关问题

最佳答案

最好的方法可能是使用原始 Postgres 驱动程序创建准备好的语句。不幸的是,ActiveRecord 没有公开一种通用的方法来执行此操作。既然 mysql2 支持准备好的语句,他们可能很快就会添加它。但与此同时,这里介绍了如何在 Rails 中使用原始 PG 驱动程序。

http://deveiate.org/code/pg/PG/Connection.html#method-i-prepare

conn = ActiveRecord::Base.connection.raw_connection
conn.prepare('my_query', 'SELECT foo FROM bar WHERE baz=$1 OR baz=$2')
result = conn.exec_prepared('my_query', ['param1', 'param2'])

请注意使用 $ 作为符号来指示位置参数。这些数字对应于您传递给 exec_prepared 的参数在数组中的位置。

关于ruby - 使用 ActiveRecord 在查询对象中转义参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28334345/

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