You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历数据库表名数组生成表名与列名映射哈希?

搞定表名-列名映射哈希的实现

嘿,我来帮你梳理下问题,修正代码里的小问题,轻松实现你想要的哈希结构!

先说说你现有代码的小坑

你当前的代码有两个关键问题:

  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:09:32