无法使用ActiveRecord从存储过程中获取结果集

时间:2013-02-19 15:48:40

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord

我的Ruby程序只是想调用一个存储过程(将进行一些计算)并返回一个我希望使用Ruby代码发送电子邮件的结果集。请注意,我不使用Rails,只使用纯Ruby和mysql2 gems。

require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => "mysql2",
  :host  => "localhost",
  :database => "<mydb>",
  :username => "<myusername>",
  :password => "<mypassword>"
)

class Rubyist < ActiveRecord::Base  
end

rubyist = Rubyist.new
puts rubyist.connection.execute("CALL ruby_routine")

返回以下错误

    Mysql2::Error: PROCEDURE students.ruby_routine can't return a result set in the given context: CALL ruby_routine (ActiveRecord::StatementInvalid)

现在我已经用Google搜索并找到了链接,但它们适用于Rails应用。我如何在纯Ruby中做到这一点?

2 个答案:

答案 0 :(得分:1)

我认为问题来自ActiveRecord中使用的mysql2连接器。正如来自mysql2的人在他们的文档中说:

  

您还可以检索多个结果集。为此你需要工作   连接标志Mysql2 :: Client :: MULTI_STATEMENTS。使用多个   结果集通常在调用存储过程时使用   返回多个结果集

因此,默认情况下未设置。是的,理想情况下如果你直接使用mysql2适配器(没有ActiveRecord),你会传递这样的标志:

client = Mysql2::Client.new(:host => "localhost", :username => "root", :flags => Mysql2::Client::MULTI_STATEMENTS )

但是,由于您使用的是ActiveRecord,因此需要覆盖mysql2连接器。这样的事情可以解决问题。

module ActiveRecord
  class Base
    # Establishes a connection to the database that's used by all Active Record objects.
    def self.mysql2_connection(config)
      config[:username] = 'root' if config[:username].nil?

      if Mysql2::Client.const_defined? :FOUND_ROWS
        config[:flags] = Mysql2::Client::FOUND_ROWS | Mysql2::Client::MULTI_STATEMENTS
      end

      client = Mysql2::Client.new(config.symbolize_keys)
      options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
      ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
    end
  end
end 

答案 1 :(得分:-2)

你的问题是语法。尝试在“rubyist”类中​​移动“establish_connection”方法。