在 psql 中可见的 Postgres 表,而不是来自 jdbc

Posted

技术标签:

【中文标题】在 psql 中可见的 Postgres 表,而不是来自 jdbc【英文标题】:Postgres table visible in psql, not from jdbc 【发布时间】:2014-02-11 19:19:15 【问题描述】:

我在 Postgres 9.1 数据库中创建了一个名为 inventory 的表。我已经能够从 psql 中选择、插入等。

但是,我正在尝试从 web 应用程序的服务器访问此表。我已将服务器代码(使用 JDBC)安装在与 Postgres 数据库相同的机器上。当我尝试从 JDBC 代码访问库存表时,我收到此错误:

org.postgresql.util.PSQLException:错误:关系“库存”不存在

我已确保我使用相同的用户名,我在用于创建连接的属性、我在 psql 中检查的用户以及从 JDBC 元数据中获取用户名之间保持一致运行时。

奇怪的是,我在笔记本电脑上进行了类似的设置(托管 Tomcat 和 webapp 以及 postgres 安装都在那里),但是当我在服务器上托管 db 和 webapp 时设置不起作用。

由于它适用于一台机器而不是另一台机器,我认为以下是可能的解释:

    我的用户配置有问题。从服务器上的 JDBC 访问可能是 Postgres 用户权限错误(我没有在服务器上设置 Postgres 安装)。 我遇到了错误的架构。我怎么知道? 不知何故我打错了机器。我试过select inet_server_addr();,但它只说127.0.0.1,这不是很有用。有没有更好的检查方法?

在另一个对话中("relation not found" using Postgres within an Eclipse Hibernate application),我看到很多人试图帮助想知道该表是否出现在 psql 中。对于那个问题,答案是否定的,他只需要创建表。对我来说,答案是肯定的,我就是看不到桌子。

知道为什么我可以连接到数据库但看不到我的用户拥有的表吗?

谢谢

【问题讨论】:

【参考方案1】:

这必须是几种可能性之一:

您连接到错误的服务器。 您连接到正确服务器上的错误数据库 您的search_path 在两个连接之间有所不同 两个连接之间的标识符引用不同 你打错了

对于前两个,使用 PgJDBC 连接,设置 application_name,然后从 psql 查询 pg_stat_activity 以确保连接到您期望的服务器,到您期望的 DB。

对于 search_path,两个连接上的 SHOW search_path;。比较。还要查看psql 中的\dt inventory,注意表所在的架构,并尝试通过其在 PgJDBC 中的限定名称来访问它,例如someschema.inventory.

引用:就是这样,表可能被命名为“Inventory”还是“INVENTORY”?如果是这样,您是否可以在一个地方将其称为INVENTORY,而在另一个地方将其称为"INVENTORY"?根据 SQL 标准,除非引用,否则 Pg 大小写折叠。

【讨论】:

谢谢。问题是我有两个名称相似的数据库,而我只是连接到错误的数据库。 pg_stat_activity 中的查询说明了这一点。

以上是关于在 psql 中可见的 Postgres 表,而不是来自 jdbc的主要内容,如果未能解决你的问题,请参考以下文章

Docker - 如何在postgres容器中运行psql命令?

Postgres 选择查询在使用 JDBC 时运行缓慢,但在从同一服务器在 PSQL 中运行时快速

如何在heroku psql上创建表?

可以在 phpPgAdmin 中查看表,但不能在 psql(或任何其他方法)中查看表

如何在 psql 中使用外键约束将一个表的结构复制到另一个表?

postgres服务相关语法