J'essaie d'exécuter le script PHP suivant pour faire une simple requête de 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:
Échec de la requête: ERREUR: la relation "sf_bands" n'existe pas
Dans tous les exemples, je peux trouver où quelqu'un obtient une erreur indiquant que la relation n'existe pas, c'est parce qu'il utilise des lettres majuscules dans son nom de table. Le nom de ma table ne contient 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 showfinder.sf_bands
-à- dire ?
php
sql
postgresql
quoted-identifier
Keyslinger
la source
la source
Réponses:
D'après ce que j'ai lu, cette erreur signifie que vous ne référencez pas correctement le nom de la table. Une raison courante est que la table est définie avec une orthographe mixte et que vous essayez de l'interroger avec toutes les minuscules.
En d'autres termes, ce qui suit échoue:
CREATE TABLE "SF_Bands" ( ... ); SELECT * FROM sf_bands; -- ERROR!
Utilisez des guillemets pour délimiter les identificateurs afin de pouvoir utiliser l'orthographe de casse mixte spécifique lorsque la table est définie.
SELECT * FROM "SF_Bands";
Concernant votre commentaire, vous pouvez ajouter un schéma au "search_path" de sorte que lorsque vous référencez un nom de table sans qualifier son schéma, la requête correspondra à ce nom de table en vérifiant chaque schéma dans l'ordre. Tout comme
PATH
dans le shell ouinclude_path
en PHP, etc. Vous pouvez vérifier votre chemin de recherche de schéma actuel:SHOW search_path "$user",public
Vous pouvez modifier le chemin de recherche de votre schéma:
SET search_path TO showfinder,public;
Voir également http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
la source
SELECT * FROM SF_Bands
cela échouera toujours, car Postgres décide de minuscules ce nom de table pour vous. Bizarre ...J'ai eu des problèmes avec ça et voici l'histoire (triste mais vraie):
Si le nom de votre table est tout en minuscules comme: comptes que vous pouvez utiliser:
select * from AcCounTs
et cela fonctionnera bienSi le nom de votre table est tout en minuscules comme:
accounts
Ce qui suit échoue:select * from "AcCounTs"
Si le nom de votre table est composé de casse mixte, par exemple: ce qui
Accounts
suit échouera:select * from accounts
Si le nom de votre table est mixte comme:
Accounts
Ce qui suit fonctionnera bien:select * from "Accounts"
Je n'aime pas me souvenir de trucs inutiles comme ça mais tu dois le faire;)
la source
Accounts
, échouera avecselect * from Accounts;
je trouve la partie la plus étrange: le même cas n'est PAS identique.Requête de processus Postgres différente des autres SGBDR. Mettez le nom du schéma entre guillemets avant le nom de votre table comme ceci, "SCHEMA_NAME". "SF_Bands"
la source
Mettez le paramètre dbname dans votre chaîne de connexion. Cela fonctionne pour moi alors que tout le reste a échoué.
Lors de la sélection, spécifiez également le fichier
your_schema
.your_table
comme ça:select * from my_schema.your_table
la source
J'ai eu un problème similaire sur OSX mais j'ai essayé de jouer avec des guillemets doubles et simples. Pour votre cas, vous pouvez essayer quelque chose comme ça
$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"
la source
Vous devez écrire le nom du schéma et le nom de la table en marque de qutotation. Comme ci-dessous:
select * from "schemaName"."tableName";
la source
C'est vraiment utile
SET search_path TO schema,public;
J'ai creusé davantage ces problèmes, et j'ai découvert comment définir ce "search_path" par defoult pour un nouvel utilisateur dans la base de données actuelle.
Ouvrez Propriétés de 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_schéma par defoult et vous pourrez utiliser tableName sans schemaName.
la source
Pour moi, le problème était que j'avais utilisé une requête sur cette table particulière pendant que Django était initialisé. Bien sûr, il lancera alors une erreur, car ces tables n'existaient pas. Dans mon cas, c'était une
get_or_create
méthode dans un fichier admin.py, qui était exécutée chaque fois que le logiciel exécutait n'importe quel type d'opération (dans ce cas, la migration). J'espère que cela aide quelqu'un.la source
La solution la plus simple consiste simplement à changer le nom de la table et tous les noms de colonne en minuscules et votre problème sera résolu.
Par exemple:
Table_Name
entable_name
etColumnName
pourcolumnname
la source
Si un nom de table contient des traits de soulignement ou des majuscules, vous devez l'entourer de guillemets doubles.
SELECT * from "Table_Name";
la source
Vous devez d'abord ajouter le schéma, par exemple
SELECT * FROM place.user_place;
Si vous ne souhaitez pas l'ajouter dans toutes les requêtes, essayez ceci:
SET search_path TO place;
Maintenant, cela fonctionnera:
SELECT * FROM user_place;
la source