2012-09-16 20 views
101

मैं अपने PostgreSQL स्थापित में liferay डेटाबेस में सभी तालिकाओं की सूची करना चाहते हैं। मैं उसको कैसे करू?psql सूची सभी तालिकाओं

मैं डेटाबेस में SELECT * FROM applications; निष्पादित करना चाहता हूं। applications मेरे liferay डीबी में एक टेबल है। यह कैसे किया जाता है?

postgres=# \list 
           List of databases 
Name | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+----------+----------+-------------+-------------+----------------------- 
liferay | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres   + 
      |   |   |    |    | postgres=CTc/postgres+ 
      |   |   |    |    | liferay=CTc/postgres 
lportal | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | 
postgres | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | 
template0 | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres   + 
      |   |   |    |    | postgres=CTc/postgres 
template1 | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres   + 
      |   |   |    |    | postgres=CTc/postgres 
(5 rows) 

postgres=# 

उत्तर

163

आप सभी टेबल सूचीकृत करना चाहते हैं, तो आप का उपयोग करना चाहिए:

\dt *.* 

संकेत मिलता है कि आप सभी स्कीमा में सभी टेबल चाहते हैं। इसमें pg_catalog, सिस्टम टेबल, और information_schema में तालिकाएं शामिल होंगी। "सभी उपयोगकर्ता परिभाषित स्कीमा में सभी तालिकाओं" कहने का कोई अंतर्निहित तरीका नहीं है; हालांकि, \dt चलाने से पहले आप रुचि के सभी स्कीमा की सूची में अपना search_path सेट कर सकते हैं।

आप जिस स्थिति में psql बैकस्लैश-आदेशों काम नहीं करेंगे इस प्रोग्राम के रूप में क्या करना चाहते हैं कर सकते हैं। यह वह जगह है जहां the INFORMATION_SCHEMA बचाव के लिए आता है। तालिकाओं को सूचीबद्ध करने के:

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'; 

BTW, अगर आप देख सकें कि क्या psql एक बैकस्लैश आदेश के जवाब में क्या कर रही है, -E ध्वज के साथ psql चलाना चाहते हैं। उदाहरण के लिए:

$ psql -E regress  
regress=# \list 
********* QUERY ********** 
SELECT d.datname as "Name", 
     pg_catalog.pg_get_userbyid(d.datdba) as "Owner", 
     pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding", 
     d.datcollate as "Collate", 
     d.datctype as "Ctype", 
     pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges" 
FROM pg_catalog.pg_database d 
ORDER BY 1; 
************************** 

ताकि आप देख सकते हैं कि psqlpg_catalog.pg_database खोज कर रहा है जब यह डेटाबेस की एक सूची हो जाता है। इसी तरह, किसी दिए गए डेटाबेस के भीतर तालिकाओं के लिए:

SELECT n.nspname as "Schema", 
    c.relname as "Name", 
    CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type", 
    pg_catalog.pg_get_userbyid(c.relowner) as "Owner" 
FROM pg_catalog.pg_class c 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE c.relkind IN ('r','') 
     AND n.nspname <> 'pg_catalog' 
     AND n.nspname <> 'information_schema' 
     AND n.nspname !~ '^pg_toast' 
    AND pg_catalog.pg_table_is_visible(c.oid) 
ORDER BY 1,2; 

यह बेहतर एसक्यूएल मानक का उपयोग करने के, पोर्टेबल INFORMATION_SCHEMA Pg प्रणाली कैटलॉग जहां संभव हो, लेकिन कभी कभी आप Pg-विशिष्ट जानकारी की आवश्यकता के बजाय। उन मामलों में system catalogs से सीधे पूछताछ करना ठीक है, और psql -E ऐसा करने के लिए सहायक मार्गदर्शिका हो सकती है।

+0

वाह! आपके बीटीडब्ल्यू के लिए बहुत बहुत धन्यवाद। यह बहुत मूल्यवान है। –

+0

'info_schema.tables' में किसी कारण से विचार शामिल हैं। (PostgreSQL 9.2 में, वैसे भी।) – jpmc26

+0

@ jpmc26 हां, 'table_type = 'VIEW' के साथ, इसलिए उन्हें बाहर करना आसान है। सामान्य एसक्यूएल में जितना संभव हो सके टेबल के समान विचारों का इलाज करने की कोशिश करता है। –

85

कनेक्ट डेटाबेस के लिए तो टेबल की सूची बनाना,:

यहाँ मेरी सभी डेटाबेस की एक सूची है

\c liferay 
\dt 

कि मैं इसे कैसे वैसे भी करते हैं।

है यदि आप चाहें, एक पंक्ति पर उन दो आदेशों को जोड़ सकते हैं:

\c liferay \dt 
+2

आप वास्तव में 'चाहते \ डीटी * *' नहीं तो ब्याज की सभी तालिकाओं 'search_path पर हैं। '। –

+2

'\ c db_name' –

+0

वाह के लिए धन्यवाद मुझे लगता है कि कोई संबंध नहीं मिला। – surfer190

4

सार्वजनिक टेबल देखने के लिए आपको

सूची टेबल

\dt 

सूची तालिका, दृश्य और पहुंच विशेषाधिकार

\dp or \z 

या सिर्फ तालिका नाम कर सकते हैं

select table_name from information_schema.tables where table_schema = 'public'; 
1

एसक्यूएल क्यू में ry, तो आप इस कोड लिख सकते हैं:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME'; 

YOUR_TABLE_SCHEME साथ अपनी मेज योजना बदलें;

उदाहरण:

select table_name from information_schema.tables 
-1

आप \? टाइप कर सकते हैं सभी psql में समर्थित आदेशों के बारे में जानकारी प्राप्त करने के लिए:

select table_name from information_schema.tables where table_schema='eLearningProject'; 

सभी योजना और सभी तालिकाओं देखने के लिए, वहाँ खंड जहां की कोई जरूरत नहीं है ।

0

यह स्वचालन लिपियों में इस्तेमाल किया जा सकता है, तो आप सभी स्कीमा में सभी तालिकाओं की जरूरत नहीं है:

for table in $(psql -qAntc '\dt' | cut -d\| -f2); do 
     ... 
    done 
संबंधित मुद्दे