如何获取结果作为Ruby中的哈希数组(mysql2 gem)

时间:2012-10-22 14:45:00

标签: mysql ruby mysql2

我在这里使用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数组中的每个hesh都采用格式column => value。我可以手动执行此操作但是从文档中我留下的印象是我可以以上述格式将结果直接加载到内存中。我需要这个,因为在那之后我必须在json中对结果进行编码,所以我一个接一个地获取行没有任何好处。此外,数据量总是非常小。

3 个答案:

答案 0 :(得分:7)

更改

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

为:

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

正如@Tadman所说,:as => :hash是默认值,所以实际上你不必指定任何东西。

答案 1 :(得分:3)

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

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

据我所知,默认格式是哈希数组。如果你想要符号键,你需要要求它们。其中很多都是宝石本身的documented

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

答案 2 :(得分:2)

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

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

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