2015-12-04 31 views
34

Ho un database postgres con più schemi. Quando mi collego al database da una shell con psql e eseguo \dt utilizza lo schema di connessione predefinito che è pubblico. C'è una bandiera che posso specificare o come posso cambiare lo schema?Come selezionare uno schema in postgres quando si usa psql?

+0

Considera: http://stackoverflow.com/questions/9067335/how-does-the-search-path-influence-identifier-resolution-and-the-current-schema/9067777#9067777 –

risposta

17

Vuoi modificare il database?

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

.

Ho letto di nuovo la tua domanda. Per visualizzare schemi

\dn - list of schemas 

Per cambiare schema, si può provare

SET search_path TO 
40

in PostgreSQL il sistema determina quale tabella si intende per a seguito di un percorso di ricerca, che è una lista di schemi a guardare in.

La prima tabella di corrispondenza nel percorso di ricerca è considerata quella desiderata, altrimenti, se non vi è corrispondenza, viene generato un errore, anche se i nomi di tabelle corrispondenti esistono in altri schemi nel database.

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

SHOW search_path; 

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

SET search_path TO myschema; 

Oppure, se si vuole di più schemi:

SET search_path TO myschema, public; 

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

11

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

Setup:

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 elenco di 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_table definizione:

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

Mostra tutte le tabelle 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 | 

ecc ...

+4

Mi mancava il periodo dopo \ dt test_schema. che risulta in "nessun messaggio trovato" Grazie per gli esempi, ha reso molto più facile :) – mehany

1

Questo è vecchio, ma ho messo 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' 
+0

Bella idea. Eviterò 'export' e il punto e virgola nei tuoi alias. In questo modo 'PGOPTIONS' non rimane in giro dopo aver lasciato psql. –

+0

@DoronGold ottimo punto, aggiornamento della risposta. Grazie – techbrownbags

0

parola chiave:

SET search_path TO 

esempio:

SET search_path TO your_schema_name;