it-swarm.com.de

PostgreSQL-Tabellenname kann nicht einfach verwendet werden ("Relation existiert nicht")

Ich versuche das folgende PHP -Skript auszuführen, um eine einfache Datenbankabfrage durchzuführen:

$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());

Das erzeugt den folgenden Fehler:

Abfrage fehlgeschlagen: FEHLER: Relation "sf_bands" ist nicht vorhanden

In allen Beispielen kann ich feststellen, dass jemand eine Fehlermeldung erhält, dass die Relation nicht existiert, weil er im Tabellennamen Großbuchstaben verwendet. Mein Tabellenname hat keine Großbuchstaben. Gibt es eine Möglichkeit, meine Tabelle abzufragen, ohne den Datenbanknamen anzugeben, d. H. showfinder.sf_bands?

124
Keyslinger

Nach dem, was ich gelesen habe, bedeutet dieser Fehler, dass Sie den Tabellennamen nicht korrekt referenzieren. Ein häufiger Grund ist, dass die Tabelle mit einer Groß-/Kleinschreibung definiert ist und Sie versuchen, sie mit Kleinbuchstaben abzufragen.

Mit anderen Worten schlägt Folgendes fehl:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Verwenden Sie Anführungszeichen in doppelte Anführungszeichen, um die spezifische Schreibweise in Groß- und Kleinschreibung zu verwenden, wenn die Tabelle definiert ist.

SELECT * FROM "SF_Bands";

Was Ihren Kommentar angeht, können Sie dem "search_path" ein Schema hinzufügen. Wenn Sie auf einen Tabellennamen verweisen, ohne dessen Schema zu qualifizieren, wird die Abfrage mit diesem Tabellennamen übereinstimmen, indem Sie jedes Schema in dieser Reihenfolge prüfen. Genauso wie PATH in der Shell oder include_path in PHP usw. Sie können Ihren aktuellen Schema-Suchpfad überprüfen:

SHOW search_path
  "$user",public

Sie können Ihren Schemasuchpfad ändern:

SET search_path TO showfinder,public;

Siehe auch http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

226
Bill Karwin

Ich hatte Probleme damit und dies ist die Geschichte (traurig aber wahr):

  1. Wenn der Name Ihrer Tabelle nur aus Kleinbuchstaben besteht, können Sie: select * from AcCounTs verwenden, und es funktioniert einwandfrei

  2. Wenn der Name Ihrer Tabelle nur aus Kleinbuchstaben besteht, wie folgt: accounts.__ Folgendes schlägt fehl: select * from "AcCounTs"

  3. Wenn Ihr Tabellenname ein gemischter Fall ist: Accounts.__ Folgendes schlägt fehl: select * from accounts

  4. Wenn Ihr Tabellenname ein gemischter Fall ist, wie folgt: Accounts Folgendes funktioniert OK: select * from "Accounts"

Ich erinnere mich nicht gerne an nutzlose Sachen, aber du musst;)

57
Mitzi

Postgres-Prozessabfrage anders als bei anderen RDMS. Setzen Sie den Schemanamen in Anführungszeichen vor den Tabellennamen "SCHEMA_NAME". "SF_Bands" 

13
Ugur Artun

Fügen Sie den Parameter dbname in Ihre Verbindungszeichenfolge ein. Es funktioniert für mich, während alles andere fehlschlug.

Geben Sie auch beim Auswählen die your_schema.your_table wie folgt an: 

select * from my_schema.your_table
10
JarosPL

Ich hatte ein ähnliches Problem unter OSX, versuchte aber mit doppelten und einfachen Anführungszeichen zu spielen. Für Ihren Fall könnten Sie so etwas versuchen

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

Das ist wirklich hilfreich

SET search_path TO schema,public;

Ich habe diese Probleme mehr herausgearbeitet und herausgefunden, wie dieser "search_path" von defoult für einen neuen Benutzer in der aktuellen Datenbank festgelegt wird.

Öffnen Sie die Eigenschaften der Datenbank, öffnen Sie dann das Blatt "Variablen" Und fügen Sie diese Variable einfach für Ihren Benutzer mit dem tatsächlichen Wert hinzu.

Nun erhält Ihr Benutzer diesen schema_name per defoult und Sie können tableName ohne schemaName verwenden.

0

Für mich bestand das Problem darin, dass ich bei der Initialisierung von Django eine Abfrage für diese bestimmte Tabelle verwendet hatte. Natürlich wird dann ein Fehler ausgegeben, da diese Tabellen nicht vorhanden waren. In meinem Fall war dies eine get_or_create-Methode in einer Datei admin.py, die immer ausgeführt wurde, wenn die Software irgendeine Art von Operation ausführte (in diesem Fall die Migration). Hoffe das hilft jemandem. 

0
Özer S.