如何循环遍历 POSTGRESQL 中的模式列表
How to loop over list of schemas in POSTGRESQL
我可以访问包含大量模式的数据库(每个模式 - 单独的存储)。而且这个数据库还没有 information_schema
.
下一段代码给出了一个超过 1K 模式的列表:
SELECT nspname FROM pg_namespace WHERE nspname LIKE 'cabinet%'
我需要为该列表中的每个方案计算某些 table 中的行数(如果存在)。类似于:
for scheme in scheme_list:
SELECT scheme, count(*) FROM scheme.table_i_need
输出应包含 schema_name 和一些整数值。
好久没找到答案,求助。
UPD:感谢Vao Tsun,我什至能够在带有模式名称的文本数组上编写这个循环。
do $$
declare
m text[];
a text[] := array[['cabinet1003052234'], ['cabinet1027326445'], ['cabinet1062828216'], ['cabinet108034857']];
s text;
begin
FOREACH m SLICE 1 IN ARRAY a LOOP
execute format('select count(*) from %I.react_order', CAST (m[1] AS regnamespace)) into s;
raise info '%: %', m,s;
end loop;
end;
$$
;
您的方法会更昂贵 - 列出模式,然后检查 table 是否存在,然后计算行数。你要么依赖 pg_stat_*
的统计数据,要么依赖 pg_class 的循环计数,就像:
t=# do $$
declare
r record;
s text;
begin
for r in (select relnamespace::regnamespace nspname,relname from pg_class where relname like 't%' and relkind = 'r') loop
execute format('select count(*) from %I.%I',r.nspname,r.relname) into s;
raise info '%.%: %', r.nspname,r.relname, s;
end loop;
end;
$$
;
INFO: postgres.tb: 1
INFO: postgres.tt: 0
INFO: public.tt: 0
INFO: postgres.t3: 1
INFO: postgres.testtable: 1
INFO: a.tt: 0
INFO: b.tt: 0
INFO: postgres.tT: 0
INFO: postgres.ta: 1
INFO: postgres.t5: 1
INFO: postgres.tb1: 1
INFO: postgres.tb2: 1
INFO: s1.t: 1
INFO: s2.t: 1
INFO: postgres.test: 1
INFO: public.test: 6
INFO: postgres.t: 9904
DO
我可以访问包含大量模式的数据库(每个模式 - 单独的存储)。而且这个数据库还没有 information_schema
.
下一段代码给出了一个超过 1K 模式的列表:
SELECT nspname FROM pg_namespace WHERE nspname LIKE 'cabinet%'
我需要为该列表中的每个方案计算某些 table 中的行数(如果存在)。类似于:
for scheme in scheme_list:
SELECT scheme, count(*) FROM scheme.table_i_need
输出应包含 schema_name 和一些整数值。
好久没找到答案,求助。
UPD:感谢Vao Tsun,我什至能够在带有模式名称的文本数组上编写这个循环。
do $$
declare
m text[];
a text[] := array[['cabinet1003052234'], ['cabinet1027326445'], ['cabinet1062828216'], ['cabinet108034857']];
s text;
begin
FOREACH m SLICE 1 IN ARRAY a LOOP
execute format('select count(*) from %I.react_order', CAST (m[1] AS regnamespace)) into s;
raise info '%: %', m,s;
end loop;
end;
$$
;
您的方法会更昂贵 - 列出模式,然后检查 table 是否存在,然后计算行数。你要么依赖 pg_stat_*
的统计数据,要么依赖 pg_class 的循环计数,就像:
t=# do $$
declare
r record;
s text;
begin
for r in (select relnamespace::regnamespace nspname,relname from pg_class where relname like 't%' and relkind = 'r') loop
execute format('select count(*) from %I.%I',r.nspname,r.relname) into s;
raise info '%.%: %', r.nspname,r.relname, s;
end loop;
end;
$$
;
INFO: postgres.tb: 1
INFO: postgres.tt: 0
INFO: public.tt: 0
INFO: postgres.t3: 1
INFO: postgres.testtable: 1
INFO: a.tt: 0
INFO: b.tt: 0
INFO: postgres.tT: 0
INFO: postgres.ta: 1
INFO: postgres.t5: 1
INFO: postgres.tb1: 1
INFO: postgres.tb2: 1
INFO: s1.t: 1
INFO: s2.t: 1
INFO: postgres.test: 1
INFO: public.test: 6
INFO: postgres.t: 9904
DO