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
?
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
J'ai eu des problèmes avec ceci et c'est l'histoire (triste mais vraie):
Si votre nom de table est tout en minuscule, par exemple: accountsvous pouvez utiliser: select * from AcCounTs
et cela fonctionnera correctement
Si votre nom de table est tout en minuscule, par exemple: accounts
Le code suivant échouera: select * from "AcCounTs"
Si le nom de votre table est mixte, comme: Accounts
Le code suivant échouera: select * from accounts
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;)
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"
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
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"
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.
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.