Come selezionare uno schema in Postgres quando si utilizza psql?


Risposte:


198

In PostgreSQL il sistema determina quale tabella si intende seguendo un percorso di ricerca, che è un elenco di schemi in cui cercare.

La prima tabella di corrispondenza nel percorso di ricerca viene considerata quella desiderata, altrimenti, se non viene rilevata alcuna corrispondenza, viene generato un errore, anche se esistono nomi di tabella di corrispondenza in altri schemi nel database.

Per mostrare il percorso di ricerca corrente è possibile utilizzare il seguente comando:

SHOW search_path;

E per inserire il nuovo schema nel percorso, è possibile utilizzare:

SET search_path TO myschema;

O se vuoi più schemi:

SET search_path TO myschema, public;

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


77

Vuoi cambiare il database?

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

Aggiornare.

Ho letto di nuovo la tua domanda. Per visualizzare schemi

\dn - list of schemas

Per modificare lo schema, puoi provare

SET search_path TO

1
Come fare questo non in psql. come "connettersi"
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'.

17
Non essere come me dimenticare il periodo successivo al nome dello schema :) (grazie, Mohamed!)
anapaulagomes

1
Questo non risponde alla domanda. Ha chiesto come modificare lo schema predefinito. Non i comandi di base per psql.
Kenny Steegmans,

27

Utilizzare il nome dello schema con punto nel comando psql per ottenere informazioni su questo schema.

Impostare:

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

Mostra l'elenco delle relazioni 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)

Mostra test_schema.test_tabledefinizione:

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

Mostra tutti i tavoli 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 | 

eccetera...


6
Mi mancava il periodo dopo \ dt test_schema. che si traduce in "nessun messaggio trovato relazione" Grazie per gli esempi, ha reso molto più semplice :)
mehany

14

Questo è vecchio, ma ho inserito le esportazioni nel mio alias per la connessione al db:

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

E per un altro schema:

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

2
Bella idea Ometterei exporte il punto e virgola nei tuoi alias. In questo modo PGOPTIONSnon rimane in giro dopo aver lasciato psql.
Doron Gold,

questa è un'ottima idea, molto più pratica dell'aggiunta di una SET search_patha ogni singola query. grazie!
hraban

6

parola chiave :

SET search_path TO

esempio :

SET search_path TO your_schema_name;

4

la soluzione rapida potrebbe essere:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

0

se giocando con psql all'interno della finestra mobile eseguirlo in questo modo:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.