我的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中做到这一点?
答案 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”方法。