如何遍历数据库表名数组生成表名与列名映射哈希?
搞定表名-列名映射哈希的实现
嘿,我来帮你梳理下问题,修正代码里的小问题,轻松实现你想要的哈希结构!
先说说你现有代码的小坑
你当前的代码有两个关键问题:
- SQL语句里写的
FROM table会把table当成字面量表名,而不是循环里的变量,等于每次都在查一个叫table的表,这肯定不对 - 哈希
h的初始化放在了循环内部,每次循环都会新建一个空哈希,最后只能拿到最后一个表的结果,白忙活前面的循环啦
完整的可运行代码
arr_table_names = ['table1','table2','table3'] # 先在循环外初始化好哈希,确保所有表的结果都存在同一个哈希里 table_columns = Hash.new { |hsh, key| hsh[key] = [] } arr_table_names.each do |table| # 用字符串插值把当前循环的表名代入SQL,这样才会查询对应的表 rs = pg_conn.exec("SELECT * FROM #{table} WHERE Id=0") # 划重点!rs.fields才是返回列名的数组,rs.nfields只是列的数量,这是你之前搞混的地方 column_names = rs.fields # 直接把列名数组赋值给哈希对应的表名键,不用push(push是往数组加元素,这里直接替换成完整的列数组) table_columns[table] = column_names end # 输出看看结果,就是你要的{"table1"=>[列名数组], ...}格式 puts table_columns.inspect
几个实用小细节
- 哈希初始化:
Hash.new { |hsh, key| hsh[key] = [] }这种写法是为了防止访问不存在的键时返回nil,不过这里我们直接赋值,其实用普通的{}也能行,但这种方式更稳妥。 - 优化查询性能:如果
WHERE Id=0可能没有数据,或者你只是想拿表结构,完全可以用SELECT * FROM #{table} LIMIT 0,这样不会返回任何行,但照样能拿到列名,大表查询的时候速度会快很多。
内容的提问来源于stack exchange,提问作者Fatna
相关产品推荐
相关产品推荐

