【问题标题】:Redshift list all schemanames, tablenames and columnnamesRedshift 列出所有模式名、表名和列名
【发布时间】:2020-10-02 07:39:47
【问题描述】:
我试图加入information_schema.columns,但发现它无法完成,而pg_table_def 是等价的。
但它的问题是只显示search_path 中存在的模式,我如何从pg_table_def 获得information_schema.columns 等效项
或者设置search_path 到处搜索?
【问题讨论】:
标签:
amazon-web-services
amazon-redshift
information-schema
【解决方案2】:
第 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)
第 3 步:设置搜索路径
SET search_path to schema1,schema2,schema3,schema4...schema(n)
第 4 步 pg_table_def
从 pg_table_def 中选择 *
【解决方案3】:
通过 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 %}