Wie wähle ich ein Schema in Postgres aus, wenn ich psql verwende?

149

Ich habe eine Postgres-Datenbank mit mehreren Schemata. Wenn ich von einer Shell mit eine Verbindung zur Datenbank herstelle psqlund diese ausführe \dt, wird das Standardverbindungsschema verwendet, das öffentlich ist . Gibt es ein Flag, das ich angeben kann, oder wie kann ich das Schema ändern?

mehany
quelle
1
Bedenken Sie: stackoverflow.com/questions/9067335/…
Erwin Brandstetter

Antworten:

195

In PostgreSQL bestimmt das System, welche Tabelle gemeint ist, indem es einem Suchpfad folgt, der eine Liste der zu durchsuchenden Schemas darstellt.

Die erste übereinstimmende Tabelle im Suchpfad wird als die gewünschte angesehen. Andernfalls wird ein Fehler ausgelöst, wenn keine Übereinstimmung vorliegt, selbst wenn übereinstimmende Tabellennamen in anderen Schemas in der Datenbank vorhanden sind.

Um den aktuellen Suchpfad anzuzeigen, können Sie den folgenden Befehl verwenden:

SHOW search_path;

Und um das neue Schema in den Pfad einzufügen, können Sie Folgendes verwenden:

SET search_path TO myschema;

Oder wenn Sie mehrere Schemata möchten:

SET search_path TO myschema, public;

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

Ciro Pedrini
quelle
77

Möchten Sie die Datenbank ändern?

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

Aktualisieren.

Ich habe deine Frage noch einmal gelesen. Schemata anzeigen

\dn - list of schemas

Um das Schema zu ändern, können Sie versuchen

SET search_path TO
Miholeus
quelle
1
Wie das geht nicht in psql. wie man "verbindet"
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
quelle
14
Sei nicht so, als würde ich die Zeit nach dem Schemanamen vergessen :) (Danke, Mohamed!)
anapaulagomes
1
Dies beantwortet die Frage nicht. Er fragte, wie das Standardschema geändert werden könne. Nicht die grundlegenden Befehle für psql.
Kenny Steegmans
27

Verwenden Sie den Schemanamen mit dem Punkt im Befehl psql, um Informationen zu diesem Schema zu erhalten.

Konfiguration:

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

Liste der Beziehungen anzeigen in 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)

Anzeigen test_schema.test_tableDefinition:

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

Alle Tabellen anzeigen in 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 | 

etc...

klin
quelle
6
Ich habe den Zeitraum nach \ dt test_schema verpasst. was zu "keine Beziehung gefunden Nachricht" führt Danke für die Beispiele, machte es viel einfacher :)
mehany
14

Das ist alt, aber ich habe Exporte in meinen Alias ​​für die Verbindung zur Datenbank eingefügt:

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

Und für ein anderes Schema:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"
Techbrownbags
quelle
2
Gute Idee. Ich würde exportdas Semikolon in Ihren Aliasnamen weglassen . Dieser Weg PGOPTIONSbleibt nicht bestehen, nachdem Sie psql verlassen haben.
Doron Gold
Dies ist eine großartige Idee, viel praktischer als das Hinzufügen einer SET search_pathzu jeder einzelnen Abfrage. Danke!
Hraban
6

Stichwort :

SET search_path TO

Beispiel:

SET search_path TO your_schema_name;
Apps herunterladen
quelle
4

Eine schnelle Lösung könnte sein:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";
Stanislav
quelle
0

Wenn Sie mit psql im Docker spielen, führen Sie es folgendermaßen aus:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Andilabs
quelle