2014-04-30 12 views
7

में तालिका स्कीमा प्राप्त करें हैलो मैं मौजूदा तालिका की स्कीमा पुनर्प्राप्त करने का प्रयास कर रहा हूं। मैं mysql डेवलपर हूं और अमेज़ॅन रेडशिफ्ट के साथ काम करने की कोशिश कर रहा हूं। मैं मौजूदा तालिका की स्कीमा कैसे निर्यात कर सकता हूं। Mysql में हम शो बनाने तालिका कमांड का उपयोग कर सकते हैं।Redshift

SHOW CREATE TABLE tblName; 

उत्तर

5

जब आप विवरण की कमी और ट्रिगर बना के साथ तालिका संरचना प्राप्त करना चाहते हैं, तो आप 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. 

हो जाएगा ताकि उत्पादन का उपयोग कर सकते सभी बाधाओं के साथ वाक्य रचना पैदा करते हैं। आशा है कि यह आपकी मदद करेगा।

+2

ऐसा लगता है कि Postgres '-d' झंडा' pg_dump' से गायब हो गया 7.3+, और डेटाबेस एक नियमित रूप से कमांडलाइन तर्क है के लिए लग रहा है। वह है: 'pg_dump -U user_name -s -t table_name db_name'। – congusbongus

0

क्या आपको इसे प्रोग्रामिक रूप से या psql प्रॉम्प्ट से पुनर्प्राप्त करने की आवश्यकता है?

psql उपयोग में: \ d + tablename

प्रोग्राम के, आप एएनएसआई मानक INFORMATION_SCHEMA यहाँ प्रलेखित विचारों को क्वेरी कर सकते हैं:

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

INFORMATION_SCHEMA.TABLES और INFORMATION_SCHEMA.COLUMNS बार देखा गया है कि तुम क्या जरूरत नहीं होनी चाहिए।

1

पोस्टग्रेज़ में, आप कैटलॉग से पूछेंगे।

psql से शॉर्टैंड्स को विभिन्न आदेशों का उपयोग करें जिनकी सूची आपको \? (सहायता के लिए) का उपयोग करके प्राप्त होगी। इसके लिए, इनमें से कोई भी:

\d yourtable 
\d+ yourtable 

किसी ऐप में उपयोग के लिए, आपको शामिल प्रासंगिक प्रश्नों को सीखना होगा। यह सादे psql के बजाय psql -E (गूंज छिपे हुए प्रश्नों के लिए) चलाकर अपेक्षाकृत सरल है।

यदि आपको सटीक तालिका तालिका विवरण की आवश्यकता है, तो @Anant उत्तर देखें।

5

हाल ही में मैंने रेडशिफ्ट क्लस्टर के बीच टेबल स्कीमा क्लोन करने के लिए एक पायथन लिपि लिखा था। आप केवल कॉलम और एक मेज के स्तंभ प्रकार चाहते हैं, आप इसे माध्यम से कर सकते हैं:

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'; 
9

यह क्वेरी आपको रेडशिफ्ट विशिष्ट विशेषताओं वितरण प्रकार/कुंजी, सॉर्ट कुंजी, प्राथमिक कुंजी, और कॉलम एन्कोडिंग सहित एक पूर्ण कथन परिभाषा प्रदान करेगी जिसमें एक निर्माण कथन के रूप में साथ ही साथ एक तालिका तालिका कथन प्रदान करेगा जो मालिक को सेट करता है वर्तमान मालिक एकमात्र चीज जो आपको नहीं बता सकती वह विदेशी कुंजी हैं। मैं बाद में काम कर रहा हूं, लेकिन आरएस में एक वर्तमान विशेषाधिकार मुद्दा है जो हमें सही तालिकाओं से पूछताछ से रोकता है। यह क्वेरी कुछ ट्यूनिंग का उपयोग कर सकती है, लेकिन मेरे पास समय या काम करने की आवश्यकता नहीं है।

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' 
+2

एडब्ल्यूएस ने इस कूल यूटिलिटी, https://github.com/awslabs/amazon-redshift-utils को सही संपीड़न एन्कोडिंग में माइग्रेट करने के लिए जारी किया है। इसमें अनुदान के एक अपवाद के साथ तालिका संरचनाओं का वर्णन करने के लिए सभी प्रश्न AWS उपयोग शामिल हैं (इसके लिए http://stackoverflow.com/questions/18741334/how-do-i-view-grants-on-redshift/21178589#21178589 देखें घटक)। –

2

मुझे वहां कोई पूरा समाधान नहीं मिला। और एक अजगर पटकथा लिखी:

https://github.com/cxmcc/redshift_show_create_table

यह pg_dump की तरह काम करेगा, के साथ साथ बुनियादी लाल विचलन सुविधाओं के साथ काम कर, SORTKEY/DISTKEY/DISTSTYLES आदि

0

नीचे कमांड काम करेगा:

mysql > show create table test.users_info; 

Redshift/postgress >pg_dump -U root-w --no-password -h 62.36.11.547 -p 5439 -s -t test.users_info ; 
संबंधित मुद्दे