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?


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


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

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

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


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"

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


4

une solution rapide pourrait être:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.