如何使用mysql2 gem创建准备好的语句?
我曾尝试用谷歌来回答这个看似简单的问题,但令我惊讶的是,它没有帮助 我的rails应用程序中的代码目前使用mysql gem的“prepare”方法。切换到mysql2时,会出现以下错误:如何使用mysql2 gem创建准备好的语句?,mysql,ruby,ruby-on-rails-3,ruby-on-rails-3.1,Mysql,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,我曾尝试用谷歌来回答这个看似简单的问题,但令我惊讶的是,它没有帮助 我的rails应用程序中的代码目前使用mysql gem的“prepare”方法。切换到mysql2时,会出现以下错误: undefined method `prepare' for #<Mysql2::Client::0....... 所以我试着寻找“prepare”方法的一个版本,但是这个搜索到目前为止还没有成功。有人能帮我解决这个问题吗 编辑:如果这是不可能的,有人能告诉我是否有一种方法可以简单地用mysql2库中
undefined method `prepare' for #<Mysql2::Client::0.......
所以我试着寻找“prepare”方法的一个版本,但是这个搜索到目前为止还没有成功。有人能帮我解决这个问题吗
编辑:如果这是不可能的,有人能告诉我是否有一种方法可以简单地用mysql2库中的内容参数化我的查询吗?更新
正如正确指出的,mysql2现在支持预处理语句。以下代码段是从中提取的:
谢谢你,瑞安
原职
我也没有发现这样的功能;既不在家也不在家。
也许下面的代码片段对您的需求有帮助?可在mysql2 gem的文档中找到:
escaped = client.escape("gi'thu\"bbe\0r's")
results = client.query("SELECT * FROM users WHERE group='#{escaped}'")
我调出使用,而不是mysql2。我很惊讶,对于使用mysql2 gem的人来说,这并不是一个更大的破坏者。我猜那些深陷于编写SQL的人已经转而使用Postgresql了吧
如果其他人在gem安装ruby mysql时遇到问题,然后是require mysql,这时会出现类似“read_eof_packet”的ruby错误:packet不是eof mysql::ProtocolError,诀窍是gem卸载ruby mysql,而不是gem安装ruby mysql ext,或者在gem文件中使用gem“ruby mysql ext”,这将替换ruby实现它还不兼容Ruby 2.0,或者至少不适用于简单的C绑定
需要明确的是,如果在安装ruby mysql ext和ruby mysql时确实需要“mysql”,它将加载ruby版本。可能有一种方法可以在特定的gem中进行请求,但我没有时间查找它。我还对缺少prepare方法感到惊讶。当然,在一个常见的ActiveRecord和Mysql2设置中,ActiveRecord必须转义字符串,而不是使用libmysql,我觉得这有点令人担忧
同时,您可以使用Rails,据我所知,MySQL活动记录适配器不支持预处理语句:
这是因为它们实际上在加快语句速度方面没有任何用处,而且由于MySQL缺乏查询规划,它们实际上会减慢速度。是的,mysql2适配器直到当前的Rails 4.0才支持绑定。我很惊讶!您可以通过~/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active\u record/connection\u adapters/mysql2\u adapter.rb中的代码片段来判断这一点
def exec_query(sql, name = 'SQL', binds = [])
result = execute(sql, name)
ActiveRecord::Result.new(result.fields, result.to_a)
end
alias exec_without_stmt exec_query
# Returns an ActiveRecord::Result instance.
def select(sql, name = nil, binds = [])
exec_query(sql, name)
end
这也有助于您理解:
在~/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active\u record/connection\u adapters/abstract/database\u statements.rb中
# Returns an ActiveRecord::Result instance.
def select_all(arel, name = nil, binds = [])
if arel.is_a?(Relation)
relation = arel
arel = relation.arel
if !binds || binds.empty?
binds = relation.bind_values
end
end
select(to_sql(arel, binds), name, binds)
end
就这样!我想我可能会转向博士后 您也可以使用mysql2 cs绑定gem: mysql2 gem现在支持根据 语法如下: statement=@client.prepareSELECT*从登录\计数=? 结果1=语句。执行1 result2=语句。execute2
这是2015年6月的一个合并拉请求。我希望能找到一种像以前一样使用参数化查询的方法。从mycolumn1=?等等祈祷能找到像这样的东西。接受这个,因为没有现成的方法。最后在我的ruby脚本中用rails外部使用的活动记录将其包装起来。谢谢。现代数据库接口不支持参数化queriesFYI,这是多么令人失望啊。对于那些遇到这个问题的人来说,它现在支持预先准备好的语句。看。将添加语法作为新答案。谢谢Ryan,更改了答案以反映更改。我不确定这是否是真的,或者可能是真的!由于必须手动打开服务器端准备的语句,因此默认情况下是关闭的。最后查看此设置和其他设置!这只花了几年时间。mysql2从0.4.0开始提供这种支持+
# Returns an ActiveRecord::Result instance.
def select_all(arel, name = nil, binds = [])
if arel.is_a?(Relation)
relation = arel
arel = relation.arel
if !binds || binds.empty?
binds = relation.bind_values
end
end
select(to_sql(arel, binds), name, binds)
end