Psql सूची सभी तालिकाओं


125

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

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

यहाँ मेरे सभी डेटाबेसों की सूची दी गई है:

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=# 

जवाबों:


203

यदि आप सभी तालिकाओं को सूचीबद्ध करना चाहते हैं , तो आपको इसका उपयोग करना चाहिए:

\dt *.*

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

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

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

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

$ 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;
**************************

इसलिए आप देख सकते हैं कि जब डेटाबेस की एक सूची मिलती है तो वह psqlखोज करता है pg_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 सिस्टम कैटलॉग के बजाय SQL- मानक, पोर्टेबल का उपयोग करना बेहतर होता है, लेकिन कभी-कभी आपको Pg- विशिष्ट जानकारी की आवश्यकता होती है। उन मामलों में सिस्टम कैटलॉग को सीधे क्वेरी करना ठीक है , और psql -Eऐसा करने के लिए एक उपयोगी मार्गदर्शक हो सकता है।


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

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

94

डेटाबेस से कनेक्ट करें, फिर तालिकाओं को सूचीबद्ध करें:

\c liferay
\dt

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

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

\c liferay \dt

2
आप वास्तव में चाहते हैं \dt *.*कि ब्याज की सभी तालिकाएँ न हों search_path
क्रेग रिंगर

10

सार्वजनिक तालिकाओं को देखने के लिए आप कर सकते हैं

सूची टेबल

\dt

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

\dp or \z

या सिर्फ टेबल के नाम

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

2

SQL क्वेरी में, आप यह कोड लिख सकते हैं:

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

अपनी तालिका योजना को अपने START_TABLE_SCHEME से बदलें;

उदाहरण:

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

सभी योजना और सभी तालिकाओं को देखने के लिए, जहां खंड की कोई आवश्यकता नहीं है:

select table_name from information_schema.tables

1

एक-पंक्ति का उदाहरण है

\dt schemaname.* 

आपके सेनारियो में

\dt public.*

0

स्वचालन स्क्रिप्ट में इसका उपयोग किया जा सकता है यदि आपको सभी स्कीमाओं में सभी तालिकाओं की आवश्यकता नहीं है:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

-3

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.