Jak wybrać schemat w postgres podczas korzystania z psql?

151

Mam bazę danych postgres z wieloma schematami. Kiedy łączę się z bazą danych z powłoki psqli uruchamiam \dt, używa ona domyślnego schematu połączenia, który jest publiczny . Czy istnieje flaga, którą mogę określić lub jak mogę zmienić schemat?

Mehany
źródło
1
Rozważ: stackoverflow.com/questions/9067335/…
Erwin Brandstetter,

Odpowiedzi:

197

W PostgreSQL system określa, którą tabelę rozumiemy, podążając ścieżką wyszukiwania, czyli listą schematów do przeszukania.

Pierwsza pasująca tabela w ścieżce wyszukiwania jest traktowana jako ta, której szukano, w przeciwnym razie, jeśli nie ma dopasowania, generowany jest błąd, nawet jeśli pasujące nazwy tabel istnieją w innych schematach w bazie danych.

Aby wyświetlić aktualną ścieżkę wyszukiwania, możesz użyć następującego polecenia:

SHOW search_path;

Aby umieścić nowy schemat na ścieżce, możesz użyć:

SET search_path TO myschema;

Lub jeśli chcesz mieć wiele schematów:

SET search_path TO myschema, public;

Źródła: https://www.postgresql.org/docs/current/static/ddl-schemas.html

Ciro Pedrini
źródło
77

Chcesz zmienić bazę danych?

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

Aktualizacja.

Przeczytałem ponownie twoje pytanie. Aby wyświetlić schematy

\dn - list of schemas

Aby zmienić schemat, możesz spróbować

SET search_path TO
miholeus
źródło
1
Jak to zrobić nie w psql. jak „połączyć”
mathtick
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'.
Mohamed Sameer
źródło
16
Nie zapominaj tak jak ja o
kropce
1
To nie odpowiada na pytanie. Zapytał, jak zmienić domyślny schemat. Nie są to podstawowe polecenia dla psql.
Kenny Steegmans
27

Użyj nazwy schematu z kropką w komendzie psql, aby uzyskać informacje o tym schemacie.

Ustawiać:

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

Pokaż listę relacji w 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)

Pokaż test_schema.test_tabledefinicję:

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

Pokaż wszystkie tabele w 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 | 

itp...

klin
źródło
6
Brakowało mi kropki po \ dt test_schema. co powoduje wyświetlenie komunikatu „brak relacji znalezionych”. Dzięki za przykłady, było to znacznie łatwiejsze :)
mehany
14

To jest stare, ale umieściłem eksport w moim aliasie do łączenia się z bazą danych:

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

A dla innego schematu:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"
techbrownbags
źródło
2
Dobry pomysł. Pominąłbym exporti średnik w twoich aliasach. W ten sposób PGOPTIONSnie pozostaje po wyjściu z psql.
Doron Gold
to świetny pomysł, znacznie bardziej praktyczny niż dodawanie SET search_pathdo każdego zapytania. Dziękuję Ci!
hraban
6

słowo kluczowe:

SET search_path TO

przykład:

SET search_path TO your_schema_name;
appsdownload
źródło
4

szybkim rozwiązaniem mogłoby być:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";
Stanislav
źródło
0

jeśli grasz z psql wewnątrz docker, wykonaj to w ten sposób:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
andilabs
źródło