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

如何用Ruby在PostgreSQL中以美观表格打印SQL查询结果

用Ruby实现PostgreSQL查询结果的美观表格输出

没问题,我帮你搞定这个需求!要把PostgreSQL里那张统计表行数的查询结果,用Ruby输出成像psql那样美观的表格,咱们有两种实用方案,看你偏好哪种:

方案一:手动实现表格格式化(无需额外依赖)

这种方式不用装额外的表格库,自己处理列宽计算和格式拼接,灵活性更高。

步骤1:安装PostgreSQL Ruby驱动

首先确保你装了pg gem,用来连接PostgreSQL:

gem install pg

步骤2:完整代码示例

require 'pg'

# 数据库连接配置,根据你的实际情况修改
db_config = {
  host: 'localhost',
  port: 5432,
  dbname: 'dvdrental',
  user: 'your_username',
  password: 'your_password'
}

# 执行查询并格式化输出表格
begin
  # 建立数据库连接
  conn = PG.connect(db_config)

  # 你提供的SQL查询语句
  sql = <<~SQL
    SELECT 
      nspname AS schemaname,
      relname,
      reltuples
    FROM pg_class C
    LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE 
      nspname NOT IN ('pg_catalog', 'information_schema') 
      AND relkind='r'
    ORDER BY reltuples DESC;
  SQL

  # 执行查询,获取结果集和字段名
  result = conn.exec(sql)
  columns = result.fields
  rows = result.to_a

  # 计算每列的最大宽度(表头+所有行内容的最大长度)
  column_widths = columns.each_with_index.map do |col, idx|
    [col.length, rows.map { |row| row[idx].to_s.length }.max].max
  end

  # 打印表头
  header = columns.each_with_index.map { |col, idx| col.ljust(column_widths[idx]) }.join(' | ')
  puts header

  # 打印分隔线
  separator = column_widths.map { |width| '-' * width }.join('-+-')
  puts separator

  # 打印每一行数据
  rows.each do |row|
    formatted_row = row.each_with_index.map { |val, idx| val.to_s.ljust(column_widths[idx]) }.join(' | ')
    puts formatted_row
  end
rescue PG::Error => e
  puts "数据库操作出错:#{e.message}"
ensure
  conn.close if conn
end

方案二:用现成表格库快速实现(推荐)

如果不想自己写格式化逻辑,可以用terminal-table这个专门用于终端表格输出的库,代码更简洁。

步骤1:安装依赖

gem install pg terminal-table

步骤2:简化版代码示例

require 'pg'
require 'terminal-table'

# 数据库连接配置,根据实际情况修改
db_config = {
  host: 'localhost',
  port: 5432,
  dbname: 'dvdrental',
  user: 'your_username',
  password: 'your_password'
}

begin
  conn = PG.connect(db_config)
  sql = <<~SQL
    SELECT 
      nspname AS schemaname,
      relname,
      reltuples
    FROM pg_class C
    LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE 
      nspname NOT IN ('pg_catalog', 'information_schema') 
      AND relkind='r'
    ORDER BY reltuples DESC;
  SQL

  result = conn.exec(sql)
  # 把查询结果转换成表格需要的格式:表头 + 数据行
  table_rows = [result.fields] + result.to_a

  # 创建并打印表格
  table = Terminal::Table.new(rows: table_rows)
  puts table
rescue PG::Error => e
  puts "数据库操作出错:#{e.message}"
ensure
  conn.close if conn
end

两种方案都能输出类似psql的美观表格,方案二更省心,适合快速开发;方案一适合需要自定义格式细节的场景。

内容的提问来源于stack exchange,提问作者Fatna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:26