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

PostgreSQL循环执行查询并返回结果行的实现方法

解决PostgreSQL动态遍历Schema统计并返回结果行的问题

你当前使用的DO匿名块仅能执行逻辑、输出日志,无法直接返回结果集。要实现返回包含Schema名称和计数的结果行,需要创建一个返回表类型的自定义函数,具体实现如下:

步骤1:创建返回表的函数

CREATE OR REPLACE FUNCTION count_adaptor_records()
RETURNS TABLE(schema_name varchar, record_count bigint)
LANGUAGE plpgsql
AS $$
DECLARE
    _schema text;
    _count bigint;
BEGIN
    -- 遍历public.environment中的所有schema名称
    FOR _schema IN SELECT display_name FROM public.environment LOOP
        -- 动态执行统计查询,将结果存入变量
        EXECUTE format(
            'SELECT count(*) FROM %I.adaptor WHERE is_deleted = false',
            _schema
        ) INTO _count;
        
        -- 将当前schema和计数作为一行加入结果集
        RETURN NEXT (_schema, _count);
    END LOOP;
END;
$$;

步骤2:调用函数获取结果

直接执行函数即可得到结构化的结果:

SELECT * FROM count_adaptor_records();

步骤3:在Python的psycopg2中调用

你可以像执行普通SELECT语句一样调用这个函数,用fetchall()或fetchone()获取结果:

import psycopg2

conn = psycopg2.connect("your_connection_string")
cur = conn.cursor()

cur.execute("SELECT * FROM count_adaptor_records();")
results = cur.fetchall()  # 获取所有结果行,每个元素是(schema_name, record_count)

# 遍历输出示例
for schema, cnt in results:
    print(f"Schema {schema}: {cnt} records")

cur.close()
conn.close()

关键说明

  • RETURNS TABLE(...):定义函数返回的表结构,指定列名和对应数据类型
  • RETURN NEXT:将每一组_schema和_count作为一行添加到结果集中
  • format()的%I:自动转义标识符(Schema/表名),避免SQL注入风险,同时兼容包含特殊字符的名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:28:20