我想加入 information_schema.columns
但却发现做不到,而且...。pg_table_def
是等价的。
但它有一个问题,即只显示存在于的模式。search_path
,我怎么能得到一个 information_schema.columns
相当于 pg_table_def
或设置 search_path
来到处搜索?
第一步:获取所有模式
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
通过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 %}