如何在没有分区的情况下列出postgres中的所有表
How to list all tables in postgres without partitions
这与 this question 密切相关,它描述了如何在 postgres 数据库的架构中列出所有 table。查询 select * from information_schema.tables
完成了这项工作。在我的例子中,模式中的一些 tables 是分区的,在这种情况下,上面的查询列出了完整的 table 以及作为单独条目的所有分区。
如何获得只包含完整 table 而没有单独分区的列表?
例如,如果架构包含名为 'example' 的 table,它在列 'bla' 上分区,具有两个值 'a' 和 'b' ,那么 information_schema.tables 将有一个条目用于 'example',然后是另外两个条目 'example_part_bla_a' 和 'example_part_bla_a'。我考虑过基于与 'part' 的子字符串匹配或类似的东西进行排除,但这对 table 的命名方式做出了假设,因此会因某些 table 名称而失败。一定有更好的方法来做到这一点。
您不会在 information_schema
中找到该信息;您将不得不直接查询目录:
SELECT c.relname
FROM pg_class AS c
WHERE NOT EXISTS (SELECT 1 FROM pg_inherits AS i
WHERE i.inhrelid = c.oid)
AND c.relkind IN ('r', 'p');
这与 this question 密切相关,它描述了如何在 postgres 数据库的架构中列出所有 table。查询 select * from information_schema.tables
完成了这项工作。在我的例子中,模式中的一些 tables 是分区的,在这种情况下,上面的查询列出了完整的 table 以及作为单独条目的所有分区。
如何获得只包含完整 table 而没有单独分区的列表?
例如,如果架构包含名为 'example' 的 table,它在列 'bla' 上分区,具有两个值 'a' 和 'b' ,那么 information_schema.tables 将有一个条目用于 'example',然后是另外两个条目 'example_part_bla_a' 和 'example_part_bla_a'。我考虑过基于与 'part' 的子字符串匹配或类似的东西进行排除,但这对 table 的命名方式做出了假设,因此会因某些 table 名称而失败。一定有更好的方法来做到这一点。
您不会在 information_schema
中找到该信息;您将不得不直接查询目录:
SELECT c.relname
FROM pg_class AS c
WHERE NOT EXISTS (SELECT 1 FROM pg_inherits AS i
WHERE i.inhrelid = c.oid)
AND c.relkind IN ('r', 'p');