为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?

Posted

技术标签:

【中文标题】为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?【英文标题】:Why does Rails 3 with Mysql2 Gem ActiveRecord::Base.connection.execute(sql) return Array not Hash?为什么带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash? 【发布时间】:2011-08-11 05:35:18 【问题描述】:

我正在将应用程序升级到 Rails 3。我决定使用 mysql2 gem。应用程序中有一些遗留代码可以进行如下调用:

results = ActiveRecord::Base.connection.execute(sql)

在2.3.x版本中使用

results.each_hash do |row|
...

但是使用 gem mysql2,结果是类型 Mysql2::Result,它只有一个 each 方法。检查了文档,他们指定结果应该是字段名称上的哈希键。太好了!

但实际上是Array,而不是Hash

当我使用 rails 控制台并实例化我自己的 Mysql2::Client 并在那里运行查询时,结果 Hash,这正是我想要的。

在rails 应用程序中,我认为最好使用ActiveRecord::Base.connection,因为它是使用database.yml 中的选项实例化的。

注意,很遗憾,结果没有映射到模型,所以我不能使用它。

我现在所做的是,例如:

result = ActiveRecord::Base.connection.execute(sql)
field_index = result.fields.index("field")
result.each do |row|
  row[field_index]
end

这是丑陋的罪恶。

有没有人可以让它返回一个哈希而不是数组?

【问题讨论】:

【参考方案1】:

前段时间我遇到了类似的问题,发现这可行:

result = ActiveRecord::Base.connection.execute(sql) 
result.each(:as => :hash) do |row| 
   row["field"] 
end

编辑:您还可以使用返回哈希的连接对象的select_all method

【讨论】:

这比选择的答案好。 您能帮我解决我的问题吗? ***.com/questions/22997103/… 这就是我想要的。谢谢【参考方案2】:

而不是

result = ActiveRecord::Base.connection.execute(sql)

results = ActiveRecord::Base.connection.exec_query(sql)

这正是你想要的。特别是,

results.first

将是一个哈希,依此类推。

感谢@_fx 解决这个问题!

欲了解更多信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html#method-i-exec_query

【讨论】:

我收到undefined method 'exec_query' for #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0x110a0dd48> @dsjoerg 谢谢你,我很难找到解决这个问题的方法。【参考方案3】:

如果你只是想重用database.yml的配置,你可以这样做:

config = ActiveRecord::Base.configurations[RAILS_ENV].symbolize_keys
conn = Mysql2::Client.new(config)
conn.query("select * from users").each do |user|
  # user should be a hash
end

【讨论】:

这比我做的方式有所改进,所以除非任何“正常工作”,我都会使用它。谢谢。 丹你能帮我解决我的问题吗? ***.com/questions/22997103/…【参考方案4】:
results = ActiveRecord::Base.connection.select(sql) 

表头

results.first.keys.each do |key|
 key
end

表格数据

results.each do |result| %>
  result.values.each do |value| %>
    value
  end
end

【讨论】:

【参考方案5】:

改进 dan 的回答,Rails 3.2.8 将不接受 RAILS_ENV。

config = ActiveRecord::Base.configurations[Rails.env].symbolize_keys conn = Mysql2::Client.new(config) conn.query("select * from users").each do |user| # 用户应该是一个哈希 结尾

【讨论】:

更新@dan 的答案,如果这是可行的,而不是给出另一个答案。 @Ian 完成。很抱歉创建了一个新答案。

以上是关于为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?的主要内容,如果未能解决你的问题,请参考以下文章

更新到 Ubuntu 16.04 后 mysql2 gem 无法正常工作 - libmysqlclient.so.18

安装 mysql2 gem 错误

gem列表中的mysql2 gem但获取项目找不到gem

mysql2 gem 的 Gem::LoadError,但它已经在 Gemfile 中

Gem::LoadError 为数据库适配器指定了 'mysql2',但是 gem 没有加载

尝试使用 mysql2 gem 安装应用程序时出错