【问题标题】: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


【解决方案1】:

当您使用 Amazon Redshift 时,可以从 svv_column 视图中获取该信息。

例如查询

SELECT * FROM svv_columns;

参考:https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_COLUMNS.html

这不受search_path 和用户运行它的权限的影响,并且对所有用户可见。

【讨论】:

    【解决方案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 %}
      

      【讨论】:

        猜你喜欢
        • 2014-03-20
        • 2014-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 2019-05-23
        • 1970-01-01
        • 2022-10-12
        相关资源
        最近更新 更多