【发布时间】:2019-10-02 16:20:44
【问题描述】:
我们的应用程序使用 Rails 公寓 gem,因此每个微型站点都有自己的架构。因此,我们有 50 个模式,每个模式都有自己的用户表。
使用 SQL(Postgres),如何从所有 50 个模式中选择用户,而不必遍历每个模式?
DO $$
DECLARE
table_name text;
BEGIN
FOR schema_name IN SELECT schema FROM tenants LOOP
EXECUTE 'SELECT * FROM ' || schema_name || '.users';
END LOOP;
END;
$$;
结果
subdomain1, 'john smith'
subdomain1, 'mary smith'
subdomain2, 'charles geiger'
subdomain2, 'ann geiger'
subdomain3, 'allison reidy'
【问题讨论】:
-
所以你有 50 个不同的表,同名,但每个表都在不同的模式中?
-
没错。截至一分钟前,它实际上是 97 个模式。该网站的开发人员使用了 gem:github.com/influitive/apartment
-
@parfait - 不幸的是,我只是对现有项目进行数据分析。我没有受雇在由上市公司开发的网站上工作。
-
如果我的任务是对此进行分析,我会开发一个 ETL 流程来从每个模式中提取并将其推入一个具有相同表的新模式中,每个表都有一个额外的列来描述源架构。然后我会在此之上通过分析构建(也可以完全移动到另一个数据库)。然后你运行一个作业来保持更新。
-
@JuanCarlosOropeza - 是的!这正是我所要求的,如果我能弄清楚的话。我在问题中的行不是 SELECT * FROM pg_catalog.pg_tables,而是给出了每个模式的名称。从租户中选择子域;
标签: sql postgresql