web-dev-qa-db-ja.com

Redshiftでテーブルスキーマを取得する

こんにちは私は既存のテーブルのスキーマを取得しようとしています。私はmysql開発者であり、Amazonredshiftを使用しようとしています。既存のテーブルのスキーマをエクスポートするにはどうすればよいですか。 mysqlでは、show createtableコマンドを使用できます。

SHOW CREATE TABLE tblName;
9
user3277217

Createステートメント、制約、およびトリガーを使用してテーブル構造を取得する場合は、pg_dumpユーティリティを使用できます。

pg_dump -U user_name -s -t table_name -d db_name
Note: -s used for schema only dump
if you want to take the data only dump , you can use -a switch.

これにより、すべての制約を含む作成構文が出力されます。これがお役に立てば幸いです。

5
Anant

このクエリは、Redshift固有の属性分布タイプ/キー、ソートキー、主キー、および列エンコーディングを含む完全なスキーマ定義をcreateステートメントの形式で提供し、所有者を現在の状態に設定するaltertableステートメントを提供します。オーナー。それがあなたに言うことができない唯一のことは外部キーです。私は後者に取り組んでいますが、RSには現在特権の問題があり、適切なテーブルをクエリできません。このクエリはある程度の調整を使用できますが、時間がないか、さらに作業する必要がありません。

select pk.pkey, tm.schemaname||'.'||tm.tablename, 'create table '||tm.schemaname||'.'||tm.tablename
||' ('
||cp.coldef
-- primary key
||decode(pk.pkey,null,'',pk.pkey)
-- diststyle and dist key
||decode(d.distkey,null,') diststyle '||dist_style||' ',d.distkey)
--sort key 
|| (select decode(skey,null,'',skey) from  (select 
' sortkey(' ||substr(array_to_string(
                 array( select ','||cast(column_name as varchar(100))  as str from
                       (select column_name from information_schema.columns col where  col.table_schema= tm.schemaname and col.table_name=tm.tablename) c2
                        join 
                        (-- gives sort cols
                          select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute pa where 
                          pa.attnum > 0  AND NOT pa.attisdropped AND pa.attsortkeyord > 0
                        ) st on tm.tableid=st.tableid and c2.column_name=st.colname   order by sort_col_order
                      )
                ,'')
              ,2,10000) || ')' as skey
))
||';'
-- additional alter table queries here to set owner
|| 'alter table '||tm.schemaname||'.'||tm.tablename||' owner to "'||tm.owner||'";'   
from 
-- t  master table list
(
SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid ,use2.usename as owner, decode(c.reldiststyle,0,'EVEN',1,'KEY',8,'ALL') as dist_style
FROM pg_namespace n, pg_class c,  pg_user use2 
WHERE n.oid = c.relnamespace 
AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
AND c.relname <> 'temp_staging_tables_1'
and c.relowner = use2.usesysid
) tm 
-- cp  creates the col params for the create string
join
(select 
substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)) as tableid
,substr(replace(replace(str,'ZZZ',''),'QQQ'||substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)),''),2,10000) as coldef
from
( select array_to_string(array(
SELECT  'QQQ'||cast(t.tableid as varchar(10))||'ZZZ'|| ','||column_name||' '|| decode(udt_name,'bpchar','char',udt_name) || decode(character_maximum_length,null,'', '('||cast(character_maximum_length as varchar(9))||')'   )
-- default
|| decode(substr(column_default,2,8),'identity','',null,'',' default '||column_default||' ')
-- nullable
|| decode(is_nullable,'YES',' NULL ','NO',' NOT NULL ') 
-- identity 
|| decode(substr(column_default,2,8),'identity',' identity('||substr(column_default,(charindex('''',column_default)+1), (length(column_default)-charindex('''',reverse(column_default))-charindex('''',column_default)   ) )  ||') ', '')
-- encoding
|| decode(enc,'none','',' encode '||enc)
 as str 
from  
-- ci  all the col info
(
select cast(t.tableid as int), cast(table_schema as varchar(100)), cast(table_name as varchar(100)), cast(column_name as varchar(100)), 
cast(ordinal_position as int), cast(column_default as varchar(100)), cast(is_nullable as varchar(20)) , cast(udt_name as varchar(50))  ,cast(character_maximum_length as int),
 sort_col_order  , decode(d.colname,null,0,1) dist_key , e.enc
from 
(select * from information_schema.columns c where  c.table_schema= t.schemaname and c.table_name=t.tablename) c
left join 
(-- gives sort cols
select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute a where 
 a.attnum > 0  AND NOT a.attisdropped AND a.attsortkeyord > 0
) s on t.tableid=s.tableid and c.column_name=s.colname
left join 
(-- gives encoding
select attrelid as tableid, attname as colname, format_encoding(a.attencodingtype::integer) AS enc from pg_attribute a where 
 a.attnum > 0  AND NOT a.attisdropped 
) e on t.tableid=e.tableid and c.column_name=e.colname
left join 
-- gives dist col
(select attrelid as tableid, attname as colname from pg_attribute a where
 a.attnum > 0 AND NOT a.attisdropped  AND a.attisdistkey = 't'
) d on t.tableid=d.tableid and c.column_name=d.colname
order by ordinal_position
) ci 
-- for the working array funct
), '') as str
from 
(-- need tableid
 SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
 FROM pg_namespace n, pg_class c
 WHERE n.oid = c.relnamespace 
 AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
 ) t 
)) cp on tm.tableid=cp.tableid
-- primary key query here
left join 
(select c.oid as tableid, ', primary key '|| substring(pg_get_indexdef(indexrelid),charindex('(',pg_get_indexdef(indexrelid))-1 ,60) as pkey
 from pg_index i , pg_namespace n, pg_class c 
 where i.indisprimary=true 
 and i.indrelid =c.oid
 and n.oid = c.relnamespace
)  pk on tm.tableid=pk.tableid
-- dist key
left join
(  select 
-- close off the col defs after the primary key 
')' ||
' distkey('|| cast(column_name as varchar(100)) ||')'  as distkey, t.tableid
from information_schema.columns c
join 
(-- need tableid
SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
FROM pg_namespace n, pg_class c
WHERE n.oid = c.relnamespace 
AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
) t on c.table_schema= t.schemaname and c.table_name=t.tablename
join 
-- gives dist col
(select attrelid as tableid, attname as colname from pg_attribute a where
a.attnum > 0 AND NOT a.attisdropped  AND a.attisdistkey = 't'
) d on t.tableid=d.tableid and c.column_name=d.colname

) d on tm.tableid=d.tableid 
where tm.schemaname||'.'||tm.tablename='myschema.mytable'
9
mike_pdb

最近、redshiftクラスター間でテーブルスキーマを複製するpythonスクリプトを作成しました。テーブルの列と列タイプのみが必要な場合は、次の方法で実行できます。

select column_name,
  case
    when data_type = 'integer' then 'integer'
    when data_type = 'bigint' then 'bigint'
    when data_type = 'smallint' then 'smallint'
    when data_type = 'text' then 'text'
    when data_type = 'date' then 'date'
    when data_type = 'real' then 'real'
    when data_type = 'boolean' then 'boolean'
    when data_type = 'double precision' then 'float8'
    when data_type = 'timestamp without time zone' then 'timestamp'
    when data_type = 'character' then 'char('||character_maximum_length||')'
    when data_type = 'character varying' then 'varchar('||character_maximum_length||')'
    when data_type = 'numeric' then 'numeric('||numeric_precision||','||numeric_scale||')'
    else 'unknown'
  end as data_type,
  is_nullable,
  column_default
 from information_schema.columns
 where table_schema = 'xxx' and table_name = 'xxx' order by ordinal_position
;

ただし、圧縮タイプとdistkey/sortkeysが必要な場合は、別のテーブルをクエリする必要があります。

select * from pg_table_def where tablename = 'xxx' and schemaname='xxx';
7
ciphor

私はそこに完全な解決策を見つけられませんでした。そして、pythonスクリプトを書きました:

https://github.com/cxmcc/redshift_show_create_table

Pg_dumpのように機能し、さらに基本的なredshift機能、SORTKEY/DISTKEY/DISTSTYLESなどを処理します。

5
user4766167

Postgresでは、カタログをクエリします。

psqlから、\?(ヘルプ用)を使用してリストを取得するさまざまなコマンドの省略形を使用します。そのため、次のいずれかです。

\d yourtable
\d+ yourtable

アプリで使用するには、関連するクエリを学習する必要があります。プレーンなpsqlの代わりにpsql -E(エコー非表示クエリの場合)を実行することで、比較的簡単です。

正確なcreatetableステートメントが必要な場合は、@ Anantの回答を参照してください。

2

Show tableはRedshiftでは機能しないため:

show table <YOUR_TABLE>;
ERROR: syntax error at or near "<YOUR_TABLE>"

Pg_table_defテーブルを使用して、スキーマを取得できます。

select "column", type, encoding, distkey, sortkey, "notnull" 
from pg_table_def
where tablename = '<YOUR_TABLE>';

注:スキーマが検索パス上にない場合は、次を使用してスキーマを検索パスに追加します。

set search_path to '$user', 'public', '<YOUR_SCHEMA>';
1
Navjot Bhardwaj

これを行う簡単な方法の1つは、AWSが提供するユーティリティを使用することです。データベースにビューを作成し、そのビューをクエリしてテーブルddlを取得するだけです。このビューを使用する利点は、元のcreatetableコマンドで使用されたsortkeyとdistkeyも提供されることです。

https://github.com/awslabs/Amazon-redshift-utils/blob/master/src/AdminViews/v_generate_tbl_ddl.sql

ビューが作成されたら、任意のテーブルのddlを取得します。このようにクエリする必要があります-

select ddl from table where tablename='table_name' and schemaname='schemaname';

注:管理スキーマがクラスターにまだ存在していない可能性があります。したがって、このビューをパブリックスキーマで作成できます。

0
conetfun

プログラムで取得する必要がありますか、それともpsqlプロンプトから取得する必要がありますか?

Psqlで使用:\ d + tablename

プログラムで、ここに記載されているANSI標準のINFORMATION_SCHEMAビューを照会できます。

http://www.postgresql.org/docs/9.1/static/information-schema.html

INFORMATION_SCHEMA.TABLESビューとINFORMATION_SCHEMA.COLUMNSビューには、必要なものが含まれている必要があります。

0
codenheim

AWSRedshiftが提供する管理ビューを使用できます--- https://github.com/awslabs/Amazon-redshift-utils/blob/master/src/AdminViews/v_generate_tbl_ddl.sql

ビューを作成したら、次を実行してスキーマ作成スクリプトを取得できます。

select * from <db_schema>.v_generate_tbl_ddl where tablename = '<table_name>'
0
LiriB