我一直在成功使用 Postgres 14,但现在我很难过。我有一个abc
包含表的数据库和模式。
\c abc
\dt -- shows tables
我创建了一个新的数据库/模式xyz
,但我看不到我创建的表:
\c xyc
\dt
Did not find any relations.
如果我使用 PgAdmin4,我可以看到xyz
's 表。如果我使用 DbVisualizer,我可以看到xyz
的表格。但是,如果我使用psql
我得到的所有东西,我是用户还是我自己(也是超级用户)Did not find any relations.
似乎并不重要。我在 PgAdmin4 中创建了这些表。那是一个错误吗?我尝试更改数据库或架构中所有对象的所有者,但无论我尝试什么,如果我使用.postgres
psql
xyz
xyz
psql
不确定这是否能说明问题:
xyz-# \conninfo
You are connected to database "xyz" as user "postgres" via socket in "/tmp" at port "5432".
xyz=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
xyz | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =Tc/postgres +
| | | | | postgres=CTc/postgres
abc | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
我看到了这个答案,它部分解决了我遇到的问题(“关系似乎丢失了,因为 Postgres 没有将 search_path 复制到新数据库”)。
也就是说,我可以看到这样的表格:
但不是这样:
我尝试设置搜索路径,目前:
至:
这是另一个看起来的方式(有效的那个),但设置没有坚持。
更新 这有效:
不幸的是,似乎设置
search_path
不粘。psql
对于这个xyz
数据库/模式,我每次启动时都必须设置它。但这似乎使设置坚持:
我想你已经回答了你自己的问题,但这里有一些观察。
从这个问题来看,我怀疑
abc
数据库的所有表都是在默认public
模式中创建的,而xyz
数据库的表是在xyz
模式中创建的。由于public
是默认搜索路径的一部分,psql
因此abc
在xyz
您必须修改search_path
.我建议阅读有关数据库、模式和表如何组合在一起的文档。
\c
不连接到模式,它连接到数据库。这是一个重要的区别。search_path
定义访问非限定对象名称时搜索模式的顺序。对象总是可以是模式限定的(即,xyz.table1
会table1
在模式中找到xyz
但table1
它自己会使用search_path
)\d
和类似的命令可以使用发现对象search_path
,但这并不一定意味着未被发现的对象是不可访问的。如您所见,您可以使用模式限定标识符访问对象,即使\d
et。人。没有列出它们。来自模式下的手册页的相关引用psql
(粗体我的):SET
命令是会话本地的,从不保存。ALTER DATABASE .. SET search_path
仅影响新会话,您必须重新连接才能看到更新的路径。