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

PostgreSQL如何分别查询普通表、分区父表及分区的名称

需求实现方案

需求1:查询普通表和分区父表名称

可以通过PostgreSQL系统表pg_class的字段特征筛选,匹配逻辑为:排除分区子表、仅保留普通表和分区父表,对应SQL如下:

SELECT relname AS table_name
FROM pg_catalog.pg_class
JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace
WHERE n.nspname = 'public'
  AND relkind IN ('r', 'p')
  AND relispartition = false
ORDER BY relname;

查询结果返回company、industry、customers三个表名。

需求2:查询所有分区子表名称

筛选逻辑为:仅标记为分区的普通表实体,对应SQL如下:

SELECT relname AS partition_name
FROM pg_catalog.pg_class
JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace
WHERE n.nspname = 'public'
  AND relkind = 'r'
  AND relispartition = true
ORDER BY partition_name;

查询结果返回cust_arr_small、cust_arr_medium、cust_arr_large三个分区名。

psycopg2 调用示例

可直接在Python脚本中使用的完整调用代码:

import psycopg2
from psycopg2.extras import RealDictCursor

# 按需修改数据库连接参数
conn_params = {
    "dbname": "你的数据库名",
    "user": "admin",
    "password": "你的数据库密码",
    "host": "你的数据库主机地址",
    "port": 5432
}

if __name__ == "__main__":
    conn = psycopg2.connect(**conn_params)
    # 获取普通表+分区父表列表
    with conn.cursor(cursor_factory=RealDictCursor) as cur:
        cur.execute("""
            SELECT relname AS table_name
            FROM pg_catalog.pg_class
            JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace
            WHERE n.nspname = 'public'
              AND relkind IN ('r', 'p')
              AND relispartition = false
            ORDER BY relname;
        """)
        normal_parent_tables = [row["table_name"] for row in cur.fetchall()]
        # 后续可直接使用normal_parent_tables变量做业务处理

    # 获取分区子表列表
    with conn.cursor(cursor_factory=RealDictCursor) as cur:
        cur.execute("""
            SELECT relname AS partition_name
            FROM pg_catalog.pg_class
            JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace
            WHERE n.nspname = 'public'
              AND relkind = 'r'
              AND relispartition = true
            ORDER BY partition_name;
        """)
        partition_tables = [row["partition_name"] for row in cur.fetchall()]
        # 后续可直接使用partition_tables变量做业务处理
    
    conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:03