如何解析SQL结果并将其转换为Ruby哈希

时间:2014-08-07 08:45:11

标签: sql ruby

我想将SQL查询结果转换为Ruby哈希,其中只显示两行,第一行作为键,第二行作为值。例如,如果我的查询得到了这个结果:

+----+--------+ | id | name | +--- +--------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | | 5 | e | +----+--------+

我想操纵这些数据来获得像这样的Ruby哈希:

h = { '1' => 'a',
      '2' => 'b'.
      '3' => 'c',
      '4' => 'd',
      '5' => 'e' }

我怎样才能完成这项工作?

1 个答案:

答案 0 :(得分:1)

我在大多数非rails项目中使用ruby Sequel。对于SQL数据库来说,这是一个很好的ORM

以下是使用SQLite(在内存中)的代码示例:

#!/usr/bin/env ruby

require 'sequel'

# create db in memory
DB = Sequel.sqlite

# create table
DB.create_table :items do
  primary_key :id
  String :name
end

# Create a dataset
items = DB[:items] 

# Populate the table
items.insert(:name => 'john')
items.insert(:name => 'mike')
items.insert(:name => 'nick')

puts "#{items.all}"
# => [{:id=>1, :name=>"john"}, {:id=>2, :name=>"mike"}, {:id=>3, :name=>"nick"}]

# initialize hash object
h = {}

# Create the hash in the form you want
items.all.each do |entry|
  h[entry[:id]]= entry[:name]
end 

# p the hash
p h # => {1=>"john", 2=>"mike", 3=>"nick"}

注意:续集非常强大。可能有一种方法可以直接执行您想要的操作,而无需通过循环传递数据。但是,您必须read the documentation了解是否需要清理代码。

希望这有帮助!

更新:所以这是Jeremy Evan(续集作者)之后的更新代码:

#!/usr/bin/env ruby

require 'sequel'

# create db in memory
DB = Sequel.sqlite

# create table
DB.create_table :items do
  primary_key :id
  String :name
end

# Create a dataset
items = DB[:items] 

# Populate the table
items.insert(:name => 'john')
items.insert(:name => 'mike')
items.insert(:name => 'nick')

# Return hash of items
p items.select_hash(:id, :name) # => {1=>"john", 2=>"mike", 3=>"nick"}