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

时间:2019-10-19 06:39:45

标签: postgresql

我正在尝试在Postgresql中创建 CREATE TABLE 命令。 创建表格后,如果我输入 TABLE 表格名称,它将起作用。

但是我输入了 \ d 表名,但在下面仍然出现错误。

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

我尝试 DROP DATABASE 表名重新创建数据库并再次重新创建表几次。但这没用。

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

14 个答案:

答案 0 :(得分:12)

如果我使用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=# 

这是因为在第12版的table OIDs are no longer treated as special columns中,因此不再需要relhasoids列。请确保您使用的是v。12 psql二进制文件,这样就不会遇到此错误。

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

答案 1 :(得分:5)

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

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

docker exec -it postgres_container_name psql your_connection_string

Postgres映像始终随附 psql 的相应版本,因此也始终进行更新,因此您不必担心在主机上安装了正确的版本。

答案 2 :(得分:3)

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

尝试使用“使用JDBC元数据进行内省”。当我(我认为)postgresql服务器和DataGrip客户端之间的版本不匹配时,这为我解决了这个问题。

在您的连接设置下->选项标签->选中使用JDBC元数据进行内省

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

切换到基于JDBC的内省器。

要检索有关数据库对象(数据库元数据)的信息,请使用DataGrip 使用以下自省者:

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

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

考虑使用本机基于JDBC的intorspector 内省者失败或不可用。

当数据库服务器版本为时,本机自省会失败 早于DataGrip支持的最低版本。

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

答案 3 :(得分:2)

我今天遇到了这个问题,由于这个原因我无法继续工作,奇怪的是应用程序代码运行正常。

后来,发现仅当我使用用于连接数据库的OmniDb客户端时,才会出现此问题。

我已将客户端切换为Postgres安装随附的默认pgAdmin 4,并且pgAdmin 4不再出现问题。链接:https://www.pgadmin.org/download/pgadmin-4-windows/

OmniDb客户端可能较旧,但现在没有时间使用pgAdmin 4对其进行故障排除。

希望有帮助。

答案 4 :(得分:2)

问题是客户端(psql)与Postgres服务器版本不同。我已经看到psql版本11与postgres版本12发生此问题。要解决此问题,请将psql版本升级到12。

如果您正在运行docker postgres,则可以执行到容器中,然后使用安装在该容器中的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

答案 5 :(得分:1)

我有同样的问题。 但是我通过在14/10/2019下载最新版本找到了解决方案 点击链接: https://postbird.paxa.kuber.host/2019_10_14.06_42-master-7a9e949

我希望对您有帮助

答案 6 :(得分:1)

仅更新DataGrip即可解决此问题,Datagrip已更新至版本DataGrip 2019.3.3,内部版本#DB-193.6494.42,建于2020年2月12日,现在可以使用:)

仅适用于DataGrip用户!

答案 7 :(得分:0)

我今天也遇到了同样的问题。就我而言,当我删除版本12并安装版本11时,该问题已解决。似乎v12具有必须与其他列一起创建的某些功能。

答案 8 :(得分:0)

要解决此问题,请编辑Postgres.php文件并注释hasObjectID函数中的行,如下所示。

function hasObjectID($table) {
    $c_schema = $this->_schema;
    $this->clean($c_schema);
    $this->clean($table);

    /*
    $sql = "SELECT relhasoids FROM pg_catalog.pg_class WHERE relname='{$table}'
        AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$c_schema}')";

    $rs = $this->selectSet($sql);
    if ($rs->recordCount() != 1) return null;
    else {
        $rs->fields['relhasoids'] = $this->phpBool($rs->fields['relhasoids']);
        return $rs->fields['relhasoids'];
    }
    */
}

答案 9 :(得分:0)

此答案特定于pgcli

如果您使用的是pgcli,则可能会遇到this issue。通过更新python软件包pgspecial即可解决。

如果您使用pgcli安装了pip,则可以根据您的python版本进行安装:

pip install -U pgspecial

pip3 install -U pgspecial

如果您使用的是Ubuntu,并且使用apt安装了pgcli,则可以使用以下命令将其切换为pip:

sudo apt remove --purge pgcli
pip3 install pgcli

或从Ubuntu packages web site更新分发软件包python-pgspecialpython3-pgspecial。在这种情况下,您可能还需要更新其依赖性。

答案 10 :(得分:0)

我遇到这个问题是因为我的 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"

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

 which psql
/usr/pgsql-12/bin/psql

答案 11 :(得分:-1)

答案 12 :(得分:-1)

使用PgAdmin查询数据库时,我遇到了同样的问题。

一旦我安装了最新版本的PgAdmin,错误就消失了!

答案 13 :(得分:-1)

我的postgresql表也遇到了同样的问题。我已通过以下查询解决了此问题。

ALTER Table MyDataBase.table_name add column column_name data_type default 0 not null;
commit;