61
votes

Comment réparer "ERREUR: la colonne c.relhasoids n'existe pas" dans Postgres?

J'essaye de CRÉER la commande TABLE dans Postgresql. Après avoir créé une table, si je saisis le nom de la table TABLE , cela fonctionne.

Mais je saisis le nom de la table \ d , je reçois toujours une erreur ci-dessous.

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

J'ai essayé le nom de table DROP DATABASE a recréé une base de données et recréé une table plusieurs fois. Mais ça n'a pas marché.

Toute suggestion serait appréciée! Merci.


4 commentaires

Quelle version utilisez-vous?


C'était résolu! Merci beaucoup à tous! localiser pg_hba.conf createdb Nao Ensuite, cela a fonctionné.


La solution simple qui a fonctionné est ici - stackoverflow.com/a/58462270/984471


Que voulez-vous dire par "si je saisis le nom de la table TABLE, cela fonctionne."


13 Réponses :


58
votes

Je suis en mesure de reproduire votre erreur si j'utilise Postgres v.12 et un client plus ancien (v.11 ou antérieur):

[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=# 

En effet, dans la version 12, les OID de table ne sont plus traités comme des colonnes spéciales et, par conséquent, la colonne relhasoids n'est plus nécessaire. Veuillez vous assurer que vous utilisez un binaire psql pour ne pas rencontrer cette erreur.

Vous n'utilisez pas nécessairement psql , donc la réponse la plus générale ici est de vous assurer que vous utilisez un client compatible.


2 commentaires

Merci beaucoup! J'utilise la v11.5 ... J'essaierai de désinstaller et de réinstaller postgress à nouveau.


Cette réponse m'a conduit au coupable dans mon cas: j'ai plusieurs installations PgAdmin, et la recherche Windows ne m'en donnait qu'une ancienne à utiliser. Par conséquent, j'utilisais un ancien PgAdmin avec un Postgres v12.



3
votes

J'ai eu ce problème aujourd'hui, je n'ai pas pu continuer à travailler à cause de cela, étrangement, le code de l'application fonctionne correctement.

Plus tard, j'ai constaté que ce problème ne se produisait que si j'utilise le client OmniDb que j'utilise pour me connecter à DB.

J'ai basculé le client sur pgAdmin 4 par défaut fourni avec l'installation de postgres et le problème ne se produit plus pgAdmin 4. Lien: https://www.pgadmin.org/download/pgadmin-4-windows/

Il est possible que le client OmniDb soit plus ancien, mais pas le temps de le dépanner, en utilisant pgAdmin 4 pour le moment.

J'espère que ça t'as aidé.


0 commentaires

2
votes

J'ai eu le même problème aujourd'hui. Dans mon cas, le problème a été résolu lorsque j'ai supprimé la version 12 et installé la version 11. Il semble que la v12 possède certaines fonctionnalités qui doivent être créées le long des autres colonnes.


1 commentaires

Vous utilisiez probablement psql de votre installation Postgres 11 pour vous connecter à Postgres 12 - vous auriez dû utiliser psql pour Postgres 12



0
votes

J'ai eu le même problème. Mais j'ai trouvé la solution en téléchargeant la dernière version le 14/10/2019 Suivez le lien: https://postbird.paxa.kuber.host/2019_10_14.06_42-master-7a9e949

J'espère que ça aide


0 commentaires

32
votes

Pour toute personne exécutant Postgres en tant que conteneur Docker :

Au lieu d'exécuter psql depuis l'hôte, exécutez-le depuis l'intérieur du conteneur, par exemple

docker exec -it postgres_container_name psql your_connection_string

L'image Postgres est toujours livrée avec la version correspondante - et donc toujours mise à jour - de psql afin que vous n'ayez pas à vous soucier d'avoir la bonne version installée sur la machine hôte.


6 commentaires

Cela manque vraiment le point. Vous devez pouvoir accéder à un conteneur de manière indépendante.


Je ne suis pas sûr de ce que signifie «accéder à un conteneur indépendamment» dans ce contexte ou pourquoi la commande dans ma réponse ne le permet pas?


Parce qu'il n'est pas toujours possible d'accéder directement au conteneur. Le problème ici semble nécessiter un service postgres séparé. La mise à niveau du client psql ou la mise à niveau du serveur est la solution; pas simplement contourner le problème et l'exécuter ensemble. Cela n'est pas toujours possible en raison d'autres contraintes architecturales.


Bien sûr; Je n'ai pas suggéré d'utiliser Docker comme solution . C'est pourquoi j'ai mené avec «Pour tous ceux qui utilisent Postgres en tant que conteneur Docker».


Pouvez-vous s'il vous plaît poster un exemple de "your_connection_string"?


Salut Olle. Ce serait toutes les options que vous passeriez à psql. Par exemple, aujourd'hui, j'ai dû exécuter ce qui précède avec «... psql -U testuser» pour m'authentifier en tant qu'utilisateur spécifique



0
votes

Pour résoudre ce problème, modifiez le fichier Postgres.php et commentez les lignes de la fonction hasObjectID comme indiqué ci-dessous.

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'];
    }
    */
}


0 commentaires

-1
votes

Utilisez simplement la version 11.

comment installer la version 11 https://websiteforstudents.com/how-to-install-postgresql-11-on-ubuntu-16-04-18-04-servers/


0 commentaires

2
votes

Le problème est que le client ( psql ) est une version différente du serveur postgres. J'ai vu ce problème avec la version 11 de psql parler de la version 12 de postgres. Pour résoudre ce problème, mettez à niveau la version de psql vers la version 12.

Si vous exécutez un docker postgres, vous pouvez l'exécuter dans le conteneur puis utiliser le client psql qui y est installé.

# 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


0 commentaires

-1
votes

J'ai eu le même problème lors de l'utilisation de PgAdmin pour interroger la base de données.

Une fois que j'ai installé la dernière version de PgAdmin, l'erreur a disparu!


0 commentaires

1
votes

Il suffit de mettre à jour DataGrip pour résoudre ce problème, Datagrip mis à jour vers la version DataGrip 2019.3.3, Build # DB-193.6494.42, construit le 12 février 2020, fonctionne maintenant :)

Juste pour les utilisateurs de DataGrip!


1 commentaires

Merci mec. Datagrip mis à jour à partir de 2017 et problème résolu!



0
votes

Cette réponse est spécifique à pgcli

Si vous utilisez pgcli vous rencontrez peut-être ce problème . Il est résolu en mettant à jour le package python pgspecial .

Si vous avez installé pgcli aide de pip , vous pouvez simplement faire, en fonction de votre version de python:

sudo apt remove --purge pgcli
pip3 install pgcli

ou

pip3 install -U pgspecial

Si vous utilisez Ubuntu et installé pgcli avec apt, vous pouvez le changer en pip avec:

pip install -U pgspecial

ou mettez à jour le package de distribution python-pgspecial ou python3-pgspecial partir du site Web des packages Ubuntu . Dans ce cas, vous devrez peut-être également mettre à jour ses dépendances.


0 commentaires

0
votes

Si vous utilisez DataGrip, il existe une solution simple:

Essayez d'utiliser «Introspect en utilisant les métadonnées JDBC». Cela a résolu le problème pour moi lorsque (je pense) que j'avais une incompatibilité de version entre le serveur postgresql et le client DataGrip.

Sous vos paramètres de connexion -> onglet Options -> cochez Introspect en utilisant les métadonnées JDBC

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

Basculez vers l'introspecteur basé sur JDBC.

Pour récupérer des informations sur les objets de base de données (métadonnées DB), DataGrip utilise les introspecteurs suivants:

  1. Un introspecteur natif (peut être indisponible pour certains SGBD). L'introspecteur natif utilise des tables et des vues spécifiques au SGBD comme source de métadonnées. Il peut récupérer des détails spécifiques aux SGBD et produire une image plus précise des objets de base de données.

  2. Un introspecteur basé sur JDBC (disponible pour tous les SGBD). L'introspecteur basé sur JDBC utilise les métadonnées fournies par le pilote JDBC. Il ne peut récupérer que des informations standard sur les objets de base de données et leurs propriétés.

Envisagez d'utiliser l'intorspector basé sur JDBC lorsque l'introspecteur natif échoue ou n'est pas disponible.

L'introspecteur natif peut échouer lorsque la version de votre serveur de base de données est antérieure à la version minimale prise en charge par DataGrip.

Vous pouvez essayer de basculer vers l'introspecteur basé sur JDBC pour résoudre les problèmes de récupération des informations de structure de base de données à partir de votre base de données. Par exemple, lorsque les schémas qui existent dans votre base de données ou les objets de base de données sous le niveau du schéma ne sont pas affichés dans la fenêtre de l'outil Base de données.


0 commentaires

-1
votes

J'ai également eu le même problème avec mes tables postgresql. J'ai résolu ce problème par la requête ci-dessous.

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


0 commentaires