web-dev-qa-db-fra.com

Pourquoi ne puis-je pas voir ma table (PostgreSQL) lorsque j'utilise \ dt (+) dans psql?

J'ai créé la table donor dans le schéma reference selon:

CREATE TABLE reference.donor (
    donor_code smallint PRIMARY KEY,
    donor_name character varying NOT NULL,
    donor_type smallint REFERENCES reference.donor_type (type_id),
    alpha_2_code char(2) REFERENCES reference.iso_3166_1 (alpha_2_code)
);

J'ai rempli le tableau selon:

INSERT INTO reference.donor (donor_code, donor_name, donor_type, alpha_2_code)
SELECT donor_code, donor_name, donor_type, alpha_2_code
FROM reference.donor_template;

Quand je cours:

\dt+ reference.*

à l'intérieur de psql, je vois la table reference.donor:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 reference | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
 reference | iso_3166_1     | table | postgres | 48 kB | 
(4 rows)

Mais lorsque j'exécute \dt+ donor* (Ou \dt(+)) je ne vois pas la table reference.donor:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 oecd_cl   | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
(3 rows)

Pourquoi ne puis-je voir la table reference.donor Que si j'exécute \dt+ reference.* Ou \dt+ *.donor?
Je m'attendais à ce que \dt (Ou \dt+) L'affiche, mais ce n'est pas le cas.

Mon search_path Inclut le schéma reference et l'utilisateur postgres a toutes les autorisations sur le schéma reference et toutes les tables du schéma selon:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

Juste pour clarifier, j'ai deux tables donor, mais elles sont dans deux schémas différents, c'est-à-dire oecd.donor & reference.donor. (Je peux voir oecd.donor Sans aucun problème lorsque j'utilise \dt(+) dans psql).

12
dw8547

La documentation sur psql explique:

Chaque fois que le paramètre pattern est complètement omis, le \d les commandes affichent tous les objets qui sont visibles dans le chemin de recherche de schéma actuel - cela équivaut à utiliser * comme modèle. (Un objet est dit visible si son schéma contenant est dans le chemin de recherche et aucun objet du même type et nom n'apparaît plus tôt dans le chemin de recherche . Cela équivaut à l'instruction selon laquelle l'objet peut être référencé par son nom sans qualification explicite de schéma.) Pour voir tous les objets dans la base de données indépendamment de la visibilité, utilisez *.* comme modèle.

Accentuation mienne.
De toute évidence, vous avez oecd_cl avant reference dans votre chemin de recherche . Utilisez ceci pour votre but:

\dt *.donor*

Et vous obtiendrez:

                          List of relations
  Schema   |      Name      | Type  |  Owner   | Size  | Description 
-----------+----------------+-------+----------+-------+-------------
 oecd_cl   | donor          | table | postgres | 16 kB | 
 reference | donor          | table | postgres | 16 kB | 
 reference | donor_template | table | postgres | 16 kB | 
 reference | donor_type     | table | postgres | 16 kB | 
(4 rows)
11
Erwin Brandstetter

La première commande fonctionne car toutes les tables répertoriées ont une "référence" dans leur schéma. La deuxième commande fonctionne de la même manière pour "donneur". la relation "reference.iso_3166_1" n'a donc pas de "donneur" dans son nom. si vous souhaitez répertorier iso_3166_1, essayez simplement

    \dt+ iso*

réf: http://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-PATTERNS

1
Sahap Asci