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?


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


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

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

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...


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"

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


4

Eine schnelle Lösung könnte sein:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.