Psql का उपयोग करते समय पोस्टग्रेज में स्कीमा का चयन कैसे करें?


151

मेरे पास कई स्कीमाओं के साथ पोस्टग्रैज डेटाबेस है। जब मैं किसी शेल से डेटाबेस से कनेक्ट करता psqlहूं और मैं चलाता हूं तो \dtयह डिफ़ॉल्ट कनेक्शन स्कीमा का उपयोग करता है जो सार्वजनिक है । क्या कोई ध्वज है जिसे मैं निर्दिष्ट कर सकता हूं या मैं स्कीमा कैसे बदल सकता हूं?


जवाबों:


197

PostgreSQL में सिस्टम यह निर्धारित करता है कि खोज पथ का अनुसरण करने से कौन सी तालिका अभिप्रेत है, जो देखने के लिए स्कीमा की सूची है।

खोज पथ में पहली मिलान तालिका एक वांछित व्यक्ति के रूप में ली गई है, अन्यथा, अगर कोई मेल नहीं खाता है तो त्रुटि उठाई जाती है, भले ही डेटाबेस में अन्य स्कीमा में मिलान तालिका नाम मौजूद हों।

वर्तमान खोज पथ दिखाने के लिए आप निम्न कमांड का उपयोग कर सकते हैं:

SHOW search_path;

और नए स्कीमा को पथ में रखने के लिए, आप उपयोग कर सकते हैं:

SET search_path TO myschema;

या यदि आप कई स्कीमा चाहते हैं:

SET search_path TO myschema, public;

संदर्भ: https://www.postgresql.org/docs/current/static/ddl-schemas.html


77

क्या आप डेटाबेस बदलना चाहते हैं?

\l - to display databases
\c - connect to new database

अपडेट करें।

मैंने आपका प्रश्न फिर से पढ़ा है। स्कीमा प्रदर्शित करने के लिए

\dn - list of schemas

स्कीमा बदलने के लिए, आप कोशिश कर सकते हैं

SET search_path TO

1
यह कैसे नहीं करने के लिए psql में। कैसे "कनेक्ट" करने के लिए
गणित

46
\l - Display database
\c - Connect to database
\dn - List schemas
\dt - List tables inside public schemas
\dt schema1. - List tables inside particular schemas. For eg: 'schema1'.

16
स्कीमा नाम के बाद की अवधि के बारे में भूल जाना मेरे लिए मत बनो :) (धन्यवाद, मोहम्मद!)
anapaulagomes

1
इस सवाल का जवाब नहीं है। उन्होंने पूछा कि डिफ़ॉल्ट स्कीमा कैसे बदला जाए। Psql के लिए मूल आदेश नहीं।
केनी स्टीलमैन

27

इस स्कीमा के बारे में जानकारी प्राप्त करने के लिए psql कमांड में अवधि के साथ स्कीमा नाम का उपयोग करें।

सेट अप:

test=# create schema test_schema;
CREATE SCHEMA
test=# create table test_schema.test_table (id int);
CREATE TABLE
test=# create table test_schema.test_table_2 (id int);
CREATE TABLE

संबंधों की सूची दिखाएँ test_schema:

test=# \dt test_schema.
               List of relations
   Schema    |     Name     | Type  |  Owner   
-------------+--------------+-------+----------
 test_schema | test_table   | table | postgres
 test_schema | test_table_2 | table | postgres
(2 rows)

test_schema.test_tableपरिभाषा दिखाएँ :

test=# \d test_schema.test_table
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

सभी तालिकाएँ दिखाएँ test_schema:

test=# \d test_schema.
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

Table "test_schema.test_table_2"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

आदि...


6
मुझे \ dt test_schema के बाद की अवधि याद आ रही थी। जिसके परिणामस्वरूप "कोई संबंध नहीं मिला संदेश" उदाहरणों के लिए धन्यवाद, इसे बहुत आसान बना दिया :)
mehany

14

यह पुराना है, लेकिन मैंने db से कनेक्ट करने के लिए अपने उपनाम में निर्यात डाला:

alias schema_one.con="PGOPTIONS='--search_path=schema_one' psql -h host -U user -d database etc"

और एक और स्कीमा के लिए:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"

2
अछा सुझाव। मैं exportआपके उपनामों में छोड़ दूंगा और अर्धविराम। इस तरह से PGOPTIONSआप psql छोड़ने के बाद आसपास नहीं रहता है।
डोरन गोल्ड

यह एक महान विचार है, SET search_pathहर एक प्रश्न में एक जोड़ने की तुलना में बहुत अधिक व्यावहारिक है । धन्यवाद!
हब्रन



0

अगर doq अंदर psql के साथ खेल रहा है तो इसे इस तरह से अंजाम दें:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.