Redshift列出了pg_table_def中的所有模式名、表名和列名。

问题描述 投票:0回答:1

我想加入 information_schema.columns 但却发现做不到,而且...。pg_table_def 是等价的。

但它有一个问题,即只显示存在于的模式。search_path,我怎么能得到一个 information_schema.columns 相当于 pg_table_def

或设置 search_path 来到处搜索?

amazon-web-services amazon-redshift information-schema
1个回答
1
投票

第一步:获取所有模式

select nspname FROM pg_namespace
where nspname not like 'pg_%' --to execlude pg schemas unless you need them
and nspname not in (select schemaname from svv_external_schemas); -- to execlude external schemas because you cannot add them to search path

第二步:把它们变成一个逗号分隔的列表

将上述查询结果转换为schema1,schema2,schema3,schema4...schema(n)

第三步:设置你的搜索路径

SET search_path to schema1,schema2,schema3,schema4...schema(n)

第四步 pg_table_def

SELECT * FROM pg_table_def


0
投票

通过SQL和jinja2模板化,将其作为一个自动化的解决方案发布,这是在DBT中运行的。

{% macro populate_schema_catalog(target_schema_name, target_table_name) %}
{%- set fetch_all_schemas -%}
    SELECT
        nspname
    FROM
        pg_namespace
    WHERE
        nspname NOT LIKE 'pg_%'
        AND nspname NOT IN (
            SELECT
                schemaname
            FROM
                svv_external_schemas
        );
{%- endset -%}

{%- set all_schemas = run_query(fetch_all_schemas).rows.values() -%}
{%- set schema_list = [] -%}

-- The schema list now contains all the schemas as such ['"meta"', '"adhoc_dbt"', ...]
{% for schema in all_schemas %}
    {%- do schema_list.append('"{}"'.format(schema[0]))-%}
{% endfor %}

-- Set the search_path
{%- set set_search_path -%}
    SET search_path TO {{ ', '.join(schema_list) }};
{%- endset -%}

{%- do run_query(set_search_path) -%}

{%- set query_pg_table_def -%}
    SELECT
        *
    FROM
        pg_table_def
{%- endset -%}

{%- set all_information = run_query(query_pg_table_def).rows.values() -%}

{% for row in all_information %}
{{ log(row) }}
{% endfor %}

{% endmacro %}
© www.soinside.com 2019 - 2024. All rights reserved.