web-dev-qa-db-fra.com

Impossible d'utiliser simplement le nom de la table PostgreSQL ("la relation n'existe pas")

J'essaie d'exécuter le script PHP suivant pour effectuer une requête simple dans la base de données:

$db_Host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("Host=$db_Host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());

$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

Cela produit l'erreur suivante:

La requête a échoué: ERROR: la relation "sf_bands" n'existe pas

Dans tous les exemples, je peux trouver où une erreur se produit, indiquant que la relation n'existe pas, c'est parce qu'ils utilisent des lettres majuscules dans leur nom de table. Mon nom de table n'a pas de lettres majuscules. Existe-t-il un moyen d'interroger ma table sans inclure le nom de la base de données, c'est-à-dire showfinder.sf_bands?

124
Keyslinger

D'après ce que j'ai lu, cette erreur signifie que vous ne faites pas correctement référence au nom de la table. Une des raisons courantes est que la table est définie avec une orthographe en majuscules et que vous essayez de l'interroger avec toutes les minuscules.

En d'autres termes, les éléments suivants échouent:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Utilisez des guillemets doubles pour délimiter les identificateurs afin de pouvoir utiliser l'orthographe à casse mixte spécifique lors de la définition de la table.

SELECT * FROM "SF_Bands";

En ce qui concerne votre commentaire, vous pouvez ajouter un schéma au "chemin_recherche" afin que, lorsque vous référencez un nom de table sans qualifier son schéma, la requête corresponde à ce nom de table en vérifiant chaque schéma dans l’ordre. Tout comme PATH dans le shell ou include_path dans PHP, etc. Vous pouvez vérifier le chemin de recherche actuel de votre schéma:

SHOW search_path
  "$user",public

Vous pouvez modifier votre chemin de recherche de schéma:

SET search_path TO showfinder,public;

Voir aussi http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

226
Bill Karwin

J'ai eu des problèmes avec ceci et c'est l'histoire (triste mais vraie):

  1. Si votre nom de table est tout en minuscule, par exemple: accountsvous pouvez utiliser: select * from AcCounTs et cela fonctionnera correctement

  2. Si votre nom de table est tout en minuscule, par exemple: accounts Le code suivant échouera: select * from "AcCounTs"

  3. Si le nom de votre table est mixte, comme: Accounts Le code suivant échouera: select * from accounts

  4. Si le nom de votre table est mixte, par exemple: Accounts Ce qui suit fonctionnera normalement: select * from "Accounts"

Je n'aime pas me souvenir de choses inutiles comme celle-ci mais il faut;)

57
Mitzi

Requête de processus Postgres différente des autres RDMS. Mettez le nom du schéma entre guillemets avant le nom de votre table, comme ceci: "SCHEMA_NAME". "SF_Bands" 

13
Ugur Artun

Placez le paramètre nom_bdd dans votre chaîne de connexion. Cela fonctionne pour moi alors que tout le reste a échoué.

De même, lors de la sélection, spécifiez le your_schema.your_table comme ceci: 

select * from my_schema.your_table
10
JarosPL

J'ai eu un problème similaire sur OSX mais j'ai essayé de jouer avec des guillemets simples et doubles. Pour votre cas, vous pouvez essayer quelque chose comme ça

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"
3
sav

C'est vraiment utile

SET search_path TO schema,public;

J'ai creusé davantage ce problème et découvert comment définir ce "chemin_recherche" par defoult pour un nouvel utilisateur dans la base de données actuelle.

Ouvrez la base de données, puis ouvrez la feuille "Variables" Et ajoutez simplement cette variable pour votre utilisateur avec la valeur réelle.

Alors maintenant, votre utilisateur obtiendra ce nom de schéma par défaut et vous pourrez utiliser tableName sans schemaName.

0

Pour moi, le problème était que j'avais utilisé une requête sur cette table pendant l'initialisation de Django. Bien sûr, cela génèrera une erreur, car ces tables n'existaient pas. Dans mon cas, il s'agissait d'une méthode get_or_create dans un fichier admin.py, qui était exécutée à chaque fois que le logiciel exécutait un type d'opération (dans ce cas, la migration). J'espère que ça aide quelqu'un. 

0
Özer S.