Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用mysql2 gem创建准备好的语句?_Mysql_Ruby_Ruby On Rails 3_Ruby On Rails 3.1 - Fatal编程技术网

如何使用mysql2 gem创建准备好的语句?

如何使用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库中

我曾尝试用谷歌来回答这个看似简单的问题,但令我惊讶的是,它没有帮助

我的rails应用程序中的代码目前使用mysql gem的“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