在psql中使用\ dt(+)时,为什么看不到表(PostgreSQL)?


12

我已经按照以下方式donor在架构中创建了表reference

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)
);

我已经按照以下表格填充了表格:

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;

当我跑步时:

\dt+ reference.*

在psql里面我看到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)

但是当我运行\dt+ donor*(或\dt(+))时,我没有看到该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)

我为什么只能看到reference.donor表,如果我跑\dt+ reference.*还是\dt+ *.donor
我原本希望\dt(或\dt+)显示它,但事实并非如此。

search_path包括该架构reference,并且该用户postgres具有对该架构reference和该架构中所有表的所有权限,具体如下:

GRANT ALL ON ALL TABLES IN SCHEMA reference TO postgres;

为了澄清起见,我有两个donor表,但是它们处于两个不同的模式,即oecd.donorreference.donor。(我在psql中oecd.donor使用时可以看到没有任何问题\dt(+))。

Answers:


11

psql上的文档说明:

只要pattern参数被完全省略,\d命令就会显示在当前模式搜索路径中可见的所有对象-这等效于*用作模式。(如果对象的包含架构位于搜索路径中,并且在搜索路径的前面没有出现相同类型和名称的对象,则该对象被认为是可见的。这等效于以下声明:可以通过名称引用该对象而无需显式架构要查看数据库中所有对象,无论可见性如何,请*.*用作模式。

大胆强调我的。
显然,您的搜索路径oecd_cl之前。将此用于您的目的:reference

\dt *.donor*

您将获得:

                          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)

好的我明白了。这是后续问题:如果我不知道一个数据库中两个不同模式中有两个名称相同的表,并且想查看该数据库中所有模式中的所有表,是否有psql meta命令它将显示所有内容,search_path而不管哪个模式放在最前面,而我却事先不知道表/模式名称?还是我最好查询information schema例如:SELECT table_schema, table_name FROM information_schema.tables ORDER BY table_schema, table_name;
dw8547

@ user4842454:信息模式有它自己的警告。。要查看所有表(包括系统目录)\dt *.*,请按照报价中的说明使用。
Erwin Brandstetter,2015年

1

第一条命令起作用是因为所有列出的表在其架构中都具有“引用”。第二个命令对“ donor”的作用相同。因此,关系“ reference.iso_3166_1”的名称中没有任何“捐赠者”。如果要列出iso_3166_1,请尝试

    \dt+ iso*

参考:http : //www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-PATTERNS


问题是为什么reference | donor第二个命令未列出。
ypercubeᵀᴹ

@SahapAsci:我主要担心的是为什么\dt(或\dt+)没有列出reference.donor表。根据reference.iso_3166_1表,一切正常。
dw8547
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.