Psql kullanırken postgres'te şema nasıl seçilir?


166

Birden çok şemaya sahip bir postgres veritabanım var. Veritabanına bir kabuktan bağlandığımda psqlve çalıştırdığımda \dt, genel olan varsayılan bağlantı şemasını kullanıyor . Belirleyebileceğim bir bayrak var mı veya şemayı nasıl değiştirebilirim?


1
Şunu

Yanıtlar:


215

PostgreSQL'de sistem, aranacak şemaların bir listesi olan bir arama yolunu izleyerek hangi tablonun kastedildiğini belirler.

Arama yolundaki ilk eşleşen tablo, aranan tablo olarak alınır, aksi takdirde, eşleşme yoksa, veritabanındaki diğer şemalarda eşleşen tablo adları mevcut olsa bile bir hata ortaya çıkar.

Mevcut arama yolunu göstermek için aşağıdaki komutu kullanabilirsiniz:

SHOW search_path;

Ve yeni şemayı yola koymak için şunları kullanabilirsiniz:

SET search_path TO myschema;

Veya birden fazla şema istiyorsanız:

SET search_path TO myschema, public;

Referans: https://www.postgresql.org/docs/current/static/ddl-schemas.html


84

Veritabanını değiştirmek istiyor musunuz?

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

Güncelleme.

Sorunuzu tekrar okudum. Şemaları görüntülemek için

\dn - list of schemas

Şemayı değiştirmek için deneyebilirsiniz

SET search_path TO

1
Bunun psql'de nasıl yapılmayacağı. "bağlanma"
mathtick

52
\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'.

21
Şema adından sonraki dönemi unutmuş gibi olmayın :) (teşekkür ederim, Mohamed!)
anapaulagomes

1
Bu soruya cevap vermiyor. Varsayılan şemanın nasıl değiştirileceğini sordu. Psql için temel komutlar değil.
Kenny Steegmans

29

Bu şema hakkında bilgi edinmek için psql komutunda nokta ile şema adını kullanın.

Kurmak:

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

İlişki listesini şurada göster 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_tableTanımı göster :

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

Tüm tabloları şu konumda göster 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 | 

vb...


6
\ Dt test_schema sonrasındaki noktayı kaçırdım. "hiçbir ilişki bulunamadı mesajı" ile sonuçlanan Örnekler için teşekkürler, çok daha kolay :)
mehany

15

Bu eski, ancak db'ye bağlanmak için takma adıma dışa aktarım koydum:

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

Ve başka bir şema için:

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

2
İyi fikir. Takma exportadlarınızdaki noktalı virgülü ve atlardım. Bu yol PGOPTIONS, psql'den ayrıldıktan sonra burada kalmaz.
Doron Gold

bu harika bir fikir, SET search_pathher bir sorguya a eklemekten çok daha pratik . teşekkür ederim!
hraban


6

hızlı çözüm şunlar olabilir:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

-1

docker içinde psql ile oynuyorsanız, şu şekilde çalıştırın:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.