Comment sélectionner un schéma dans postgres lors de l'utilisation de psql?

152

J'ai une base de données postgres avec plusieurs schémas. Lorsque je me connecte à la base de données à partir d'un shell avec psqlet que je l'exécute, \dtil utilise le schéma de connexion par défaut qui est public . Y a-t-il un indicateur que je peux spécifier ou comment puis-je changer le schéma?

mehany
la source
1
Considérez: stackoverflow.com/questions/9067335/…
Erwin Brandstetter

Réponses:

198

Dans PostgreSQL, le système détermine quelle table est signifiée en suivant un chemin de recherche, qui est une liste de schémas à rechercher.

La première table correspondante dans le chemin de recherche est considérée comme celle souhaitée, sinon, s'il n'y a pas de correspondance, une erreur est générée, même si les noms de table correspondants existent dans d'autres schémas de la base de données.

Pour afficher le chemin de recherche actuel, vous pouvez utiliser la commande suivante:

SHOW search_path;

Et pour mettre le nouveau schéma dans le chemin, vous pouvez utiliser:

SET search_path TO myschema;

Ou si vous voulez plusieurs schémas:

SET search_path TO myschema, public;

Référence: https://www.postgresql.org/docs/current/static/ddl-schemas.html

Ciro Pedrini
la source
77

Voulez-vous changer de base de données?

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

Mettre à jour.

J'ai relu votre question. Pour afficher les schémas

\dn - list of schemas

Pour changer de schéma, vous pouvez essayer

SET search_path TO
Miholeus
la source
1
Comment faire cela pas dans psql. comment "se connecter"
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
la source
17
Ne soyez pas comme moi en oubliant la période après le nom du schéma :) (merci, Mohamed!)
anapaulagomes
1
Cela ne répond pas à la question. Il a demandé comment changer le schéma par défaut. Pas les commandes de base pour psql.
Kenny Steegmans le
27

Utilisez le nom du schéma avec un point dans la commande psql pour obtenir des informations sur ce schéma.

Installer:

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

Afficher la liste des relations dans 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)

Afficher la test_schema.test_tabledéfinition:

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

Afficher toutes les tables en 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
la source
6
Il me manquait la période après \ dt test_schema. ce qui se traduit par "aucun message trouvé de relation" Merci pour les exemples, c'est beaucoup plus facile :)
mehany
14

C'est vieux, mais j'ai mis les exports dans mon alias pour me connecter à la base de données:

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

Et pour un autre schéma:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"
sacs à main
la source
2
Bonne idée. J'omettrais exportet le point-virgule dans vos alias. De cette façon, PGOPTIONSne restez pas après avoir quitté psql.
Doron Gold
c'est une excellente idée, bien plus pratique que d'ajouter un SET search_pathà chaque requête. Merci!
hraban
6

mot-clé :

SET search_path TO

exemple :

SET search_path TO your_schema_name;
téléchargement d'applications
la source
4

une solution rapide pourrait être:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";
Stanislav
la source
0

si vous jouez avec psql dans le docker, exécutez-le comme ceci:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
andilabs
la source