使用键创建哈希是表名,值是列名

时间:2018-03-20 19:44:10

标签: ruby postgresql

我想迭代一个有数据库表名的数组,我想创建一个像这样的哈希:

{"table1"=>[column1,...,columnN],"table2"=>[column1,...,columnM]...}

这是我到目前为止所做的:

arr_table_names = ['table1','table2','table3']

arr_table_names.each do |table|  
 rs = pg_conn.exec 'SELECT * FROM table WHERE Id=0'
 column_names = rs.nfields
   h = Hash.new{|hsh,key| hsh[key] = [] }
   h[table].push ??? column_names ?? I don't know how in this line

end

我尝试使用Sebastian的解决方案,但出现语法错误:

def check_tables_same_content(table1,table2)
   result = %w[#{table1} #{table2}].each_with_object([]) do |table, arr|
    arr << { table.to_sym => @pg_conn.exec("SELECT * FROM #{table} WHERE false").fields }
   end
   puts result2    
 end  
check_tables_same_content('company','company2')

company.rb:21:in `exec': ERROR:  syntax error at or near "#" (PG::SyntaxError)
LINE 1: SELECT * FROM #{table1} WHERE false
                  ^

请注意,我不是在查看如何返回列名。

1 个答案:

答案 0 :(得分:-1)

使用.map创建一个新数组并传递该块。这应该有效:

arr_table_names.map do |table|  
    rs = pg_conn.execute "SELECT * FROM #{table} WHERE Id=0"
    {table => rs.fields}
end

更新,你想要一个表名作为键的哈希值,以及列作为值的哈希值:

arr_table_names = ['table1','table2','table3']
hash = {}
arr_table_names.each do |table|  
    rs = pg_conn.execute "SELECT * FROM #{table} WHERE Id=0"
    hash[table] = rs.fields
end

更新2,您希望行数据作为散列中每列(键)的数组:

arr_table_names = ['table1','table2','table3']
hash = {}
arr_table_names.each do |table|  
  rows = pg_conn.execute "SELECT * FROM #{table}"
  hash[table] = rows.entries.map(&:values)
end