如何解决Postgres中的“错误:列c.relhasoids不存在”?

Nao*_*Nao 9 postgresql

我正在尝试在Postgresql中创建TABLE命令。创建表后,如果我在TABLE 表名中打孔,它将起作用。

但是我打入\ d 表名,下面一直出现错误。

ERROR: column c.relhasoids does not exist LINE 1: ...riggers, c.relrowsecurity, c.relforcerowsecurity, c.relhasoi...

我尝试使用DROP DATABASE 表名重新创建数据库,然后再次重新创建表几次。但这没有用。

任何建议,将不胜感激!谢谢。

Dav*_*mpy 20

如果您使用的是 DataGrip,有一个简单的解决方法:

尝试使用“使用 JDBC 元数据进行内省”。当(我认为)我在 postgresql 服务器和 DataGrip 客户端之间存在版本不匹配时,这为我修复了它。

在您的连接设置 -> 选项选项卡 -> 使用 JDBC 元数据检查 Introspect

根据https://www.jetbrains.com/help/datagrip/data-sources-and-drivers-dialog.html#optionsTab

切换到基于 JDBC 的自省器。

为了检索有关数据库对象(DB 元数据)的信息,DataGrip 使用以下内省器:

  1. 本机内省器(可能对某些 DBMS 不可用)。本机内省器使用 DBMS 特定的表和视图作为元数据的来源。它可以检索特定于 DBMS 的详细信息并生成更精确的数据库对象图片。

  2. 基于 JDBC 的自省器(可用于所有 DBMS)。基于 JDBC 的内省器使用 JDBC 驱动程序提供的元数据。它只能检索有关数据库对象及其属性的标准信息。

当本机自省器失败或不可用时,请考虑使用基于 JDBC 的自省器。

当您的数据库服务器版本低于 DataGrip 支持的最低版本时,本机内省器可能会失败。

您可以尝试切换到基于 JDBC 的自省器来解决从数据库中检索数据库结构信息的问题。例如,当数据库工具窗口中未显示数据库中存在的模式或模式级别以下的数据库对象时。


小智 12

问题是客户端 ( psql) 与 postgres 服务器的版本不同。我在 psql 版本 11 与 postgres 版本 12 交谈时看到了这个问题。要解决这个问题,请将 psql 版本升级到 12。

如果您正在运行 docker postgres,您可以 exec 进入容器,然后使用安装在那里的 psql 客户端。

# get the container id with this
docker ps
# Then exec into the container, please note the host will now be 120.0.0.1
docker exec -it c12e8c6b8eb5 /bin/bash
Run Code Online (Sandbox Code Playgroud)


JL_*_*_SO 10

我遇到这个问题是因为我的 psql 是 9.2 而服务器版本是 12.7。所以......显然 psql 客户端需要更新。但如何呢?

在下载/安装任何内容之前,您可能已经拥有正确的版本。就我而言,我做到了。

我执行which psql后显示我的版本来自/usr/bin/psql. 然后我检查了一下/usr/pgsql-12/bin,发现里面有一个psql。所以我需要做的就是确保从那里获取 psql。有很多地方可以控制这一点;就我而言,我只是将此行添加到我的.pgsql_profile(在 postgres 用户的主目录中):

export PATH="/usr/pgsql-12/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

以 postgres 身份注销并重新登录并执行,which psql显示更改已成功:

 which psql
/usr/pgsql-12/bin/psql
Run Code Online (Sandbox Code Playgroud)


ric*_*yen 9

如果我使用的是Postgres v.12和较旧的客户端(v.11或更早版本),则可以重现您的错误:

[root@def /]# psql -h 172.17.0.3
psql (11.5, server 12.0)
WARNING: psql major version 11, server major version 12.
         Some psql features might not work.
Type "help" for help.

postgres=# create table mytable (id int, name text);
CREATE TABLE
postgres=# table mytable;
 id | name 
----+------
(0 rows)

postgres=# \d mytable;
ERROR:  column c.relhasoids does not exist
LINE 1: ...riggers, c.relrowsecurity, c.relforcerowsecurity, c.relhasoi...
                                                             ^
postgres=# 
Run Code Online (Sandbox Code Playgroud)

这是因为在第12版中,表OID不再被视为特殊列,因此relhasoids不再需要该列。请确保您使用的是v。12 psql二进制文件,这样就不会遇到此错误。

您不一定要使用psql,所以这里更通用的答案是确保您使用的是兼容的客户端。

  • 这个答案让我找到了我的案例的罪魁祸首:我安装了多个 PgAdmin,而 Windows 搜索只给了我一个旧的可供使用。因此我使用的是旧的 PgAdmin 和 Postgres v12。 (2认同)

joa*_*kim 5

对于将Postgres作为Docker容器运行的任何人:

而不是从主机运行psql,而是从容器内部运行它,例如

docker exec -it postgres_container_name psql your_connection_string
Run Code Online (Sandbox Code Playgroud)

Postgres的形象总是附带相应的,因而总是更新版本psql的,所以你不必担心有安装在主机上的正确版本。

  • 当然; 我不建议使用 Docker *作为解决方案*。这就是为什么我提出“对于任何将 Postgres 作为 Docker 容器运行的人”。 (3认同)