如何在Postgres中修复"ERROR: column c.relhasoids does not exist"?



我正在Postgresql中尝试CREATE TABLE命令。创建表后,如果我输入table表名,它就可以工作了。

但我输入了\d表名,我在下面不断收到一个错误。

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

我尝试DROP DATABASE表名重新创建数据库,并多次重新创建表。但它没有起作用。

如有任何建议,我们将不胜感激!非常感谢。

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

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

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

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

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

docker exec -it postgres_container_name psql your_connection_string

Postgres镜像总是附带相应的psql版本,因此您不必担心在主机上安装了正确的版本。

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

尝试使用";使用JDBC元数据进行反思";。这为我修复了postgresql服务器和DataGrip客户端之间版本不匹配的问题。

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

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

切换到基于JDBC的内省器。

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

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

  2. 一个基于JDBC的内省器(可用于所有DBMS)。基于JDBC内省器使用JDBC驱动程序提供的元数据。它可以仅检索有关数据库对象及其属性。

当本机内省器失败或不可用。

当您的数据库服务器版本为早于DataGrip支持的最低版本。

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

问题是客户端(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

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

此答案特定于pgcli

如果您正在使用pgcli,则可能会遇到此问题。它通过更新python包pgspecial来解决。

如果您使用pip安装pgcli,您可以简单地执行,具体取决于您的python版本:

pip install -U pgspecial

pip3 install -U pgspecial

如果你使用的是Ubuntu,并且使用apt安装了pgcli,你可以用将其切换到pip

sudo apt remove --purge pgcli
pip3 install pgcli

或者从Ubuntu软件包网站更新分发软件包CCD_ 17或CCD_。在这种情况下,您可能还需要更新它的依赖关系。

我今天遇到了这个问题,因此无法继续工作,奇怪的是,应用程序代码运行良好。

后来,我发现只有当我使用OmniDb客户端连接到DB时,才会出现这个问题。

我已经将客户端切换到默认的pgAdmin 4,它附带postgres安装&问题不再发生pgAdmin 4。链接:https://www.pgadmin.org/download/pgadmin-4-windows/

OmniDb客户端可能更旧,但没有时间对其进行故障排除,目前使用pgAdmin4。

希望能有所帮助。

刚刚更新DataGrip就解决了这个问题,DataGrip更新到版本DataGrip 2019.3.3,版本号DB-193.6494.42,构建于2020年2月12日,现在正在工作:)

仅适用于DataGrip用户!

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

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

我希望它能帮助

要解决此问题,请编辑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'];
}
*/
}

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

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

您也可以尝试重新启动pgadmin。

从postgres96升级到postgres12后,我遇到了同样的问题。我的pgadmin运行的是psqlv12.0,所以这不是问题所在。我为一个单独的问题重新启动了pgadmin,relhasoids问题消失了。

如果有人能向我解释为什么这样做,我将不胜感激。

只需使用版本11。

如何安装版本11https://websiteforstudents.com/how-to-install-postgresql-11-on-ubuntu-16-04-18-04-servers/

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

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

最新更新