【问题标题】:How to obtain result as array of Hashes in Ruby (mysql2 gem)如何在Ruby(mysql2 gem)中以哈希数组的形式获取结果
【发布时间】:2012-10-12 09:48:13
【问题描述】:

我正在使用此处找到的 Ruby 的 mysql2 gem: https://github.com/brianmario/mysql2

我有以下代码:

client = Mysql2::Client.new(
  :host => dbhost, 
  :port => dbport, :database => dbname,
  :username => dbuser, 
  :password => dbpass)
sql = "SELECT column1, column2, column3 FROM table WHERE id=#{id}"
res = client.query(sql, :as => :array)
p res # prints #<Mysql2::Result:0x007fa8e514b7d0>

上面的.query 调用是否有可能返回哈希数组,res 数组中的每个哈希都采用column =&gt; value 的格式。我可以手动执行此操作,但从文档中给我留下的印象是我可以将结果以上述格式直接加载到内存中。我需要这个,因为在那之后我无论如何都必须将结果编码为 json,所以我没有优势一一获取行。而且数据量总是很小。

【问题讨论】:

  • 仅供参考:如果您碰巧使用 Rails,您可以使用 Rails.configuration.database_configuration[Rails.env] 代替 new 的参数哈希。

标签: mysql ruby mysql2


【解决方案1】:

您始终可以直接以 JSON 格式获取结果:

res = client.query(sql, :as => :json)

据我所知,默认格式是散列数组。如果您想要符号键,则需要询问这些键。其中很多是宝石本身中的documented

您还应该非常谨慎地使用字符串替换在查询中插入内容。尽可能使用占位符。 mysql2 驱动程序不直接支持这些,因此您应该使用 ActiveRecord 或 Sequel 等适配器层。

【讨论】:

  • client.query(sql, :as =&gt; :json)client.query(sql, :as =&gt; :array) 返回 Mysql2::Result 对象,而不是哈希或 json 数组。另外我的印象是:as =&gt; :json 没有实现。
  • 是的。你只需要问你想要的结果。试试result.to_sresult.to_a
  • (:as =&gt; :json).to_s 仍然返回 Mysql2::Result object, :as =&gt; :hash 解决了它。感谢您的想法
【解决方案2】:

改变

res = client.query(sql, :as => :array)

到:

res = client.query(sql, :as => :hash)

正如@Tadman 所说,:as =&gt; :hash 是默认值,因此实际上您不必指定任何内容。

【讨论】:

  • 默认值变了吗?似乎默认是:array in 0.3.13
【解决方案3】:

mysql2 的source code 将MySql2::Result 实现为简单的include Enumerable,因此访问数据的明显方法是使用Enumerabledoc here 中实现的任何方法。

例如,#each、#each_with_index、#collect 和 #to_a 都是访问Result 元素的有用方法。

puts res.collect{ |row| "Then the next result was #{row}" }.join("\t")

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 2018-05-19
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多