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());
Dies führt zu folgendem Fehler:
Abfrage fehlgeschlagen: FEHLER: Beziehung "sf_bands" existiert nicht
In allen Beispielen kann ich feststellen, dass jemand eine Fehlermeldung erhält, dass die Beziehung nicht existiert, weil er in seinem Tabellennamen Großbuchstaben verwendet. Mein Tabellenname enthält keine Großbuchstaben. Gibt es eine Möglichkeit, meine Tabelle abzufragen, ohne den Datenbanknamen anzugeben, dh showfinder.sf_bands
?
php
sql
postgresql
quoted-identifier
Keyslinger
quelle
quelle
Antworten:
Nach dem, was ich gelesen habe, bedeutet dieser Fehler, dass Sie den Tabellennamen nicht richtig referenzieren. Ein häufiger Grund ist, dass die Tabelle in gemischter Schreibweise definiert ist und Sie versuchen, sie in Kleinbuchstaben abzufragen.
Mit anderen Worten, Folgendes schlägt fehl:
Verwenden Sie doppelte Anführungszeichen, um Bezeichner abzugrenzen, damit Sie die spezifische Schreibweise in Groß- und Kleinschreibung verwenden können, wenn die Tabelle definiert ist.
Zu Ihrem Kommentar können Sie dem "Suchpfad" ein Schema hinzufügen, sodass die Abfrage, wenn Sie auf einen Tabellennamen verweisen, ohne dessen Schema zu qualifizieren, mit diesem Tabellennamen übereinstimmt, indem jedes Schema der Reihe nach überprüft wird. Genau wie
PATH
in der Shell oderinclude_path
in PHP usw. Sie können Ihren aktuellen Schemasuchpfad überprüfen:Sie können Ihren Schemasuchpfad ändern:
Siehe auch http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
quelle
SELECT * FROM SF_Bands
dies eingeben, schlägt dies anscheinend immer noch fehl, da Postgres beschließt, diesen Tabellennamen für Sie in Kleinbuchstaben zu schreiben. Seltsam ...Ich hatte Probleme damit und das ist die Geschichte (traurig, aber wahr):
Wenn Ihr Tabellenname nur in Kleinbuchstaben geschrieben ist, wie: Konten, die Sie verwenden können:
select * from AcCounTs
und es wird gut funktionierenWenn Ihr Tabellenname nur in Kleinbuchstaben geschrieben ist, schlägt
accounts
Folgendes fehl:select * from "AcCounTs"
Wenn Ihr Tabellenname wie folgt gemischt ist:
Accounts
Folgendes schlägt fehl:select * from accounts
Wenn Ihr Tabellenname wie folgt gemischt ist:
Accounts
Folgendes funktioniert in Ordnung:select * from "Accounts"
Ich mag es nicht, mich an solche nutzlosen Dinge zu erinnern, aber du musst;)
quelle
Accounts
wird scheiternselect * from Accounts;
, wenn ich den seltsamsten Teil finde: Der gleiche Fall ist NICHT identisch.Postgres-Prozessabfrage unterscheidet sich von anderen RDMS. Setzen Sie den Schemanamen in doppelte Anführungszeichen vor Ihren Tabellennamen wie folgt: "SCHEMA_NAME". "SF_Bands"
quelle
Fügen Sie den Parameter dbname in Ihre Verbindungszeichenfolge ein. Es funktioniert bei mir, während alles andere fehlgeschlagen ist.
Geben Sie auch bei der Auswahl die Option an
your_schema
.your_table
so was:quelle
Ich hatte ein ähnliches Problem unter OSX, versuchte aber, mit doppelten und einfachen Anführungszeichen herumzuspielen. Für Ihren Fall könnten Sie so etwas versuchen
quelle
Das ist wirklich hilfreich
Ich habe diese Probleme genauer untersucht und herausgefunden, wie dieser "Suchpfad" standardmäßig für einen neuen Benutzer in der aktuellen Datenbank festgelegt werden kann.
Öffnen Sie die Datenbankeigenschaften, öffnen Sie das Blatt "Variablen" und fügen Sie diese Variable einfach für Ihren Benutzer mit dem tatsächlichen Wert hinzu.
Jetzt erhält Ihr Benutzer diesen Schemanamen standardmäßig und Sie können tableName ohne schemaName verwenden.
quelle
Sie müssen den Schemanamen und den Tabellennamen in das Anführungszeichen schreiben. Wie nachstehend:
quelle
Für mich war das Problem, dass ich eine Abfrage für diese bestimmte Tabelle verwendet hatte, während Django initialisiert wurde. Natürlich wird dann ein Fehler ausgegeben, da diese Tabellen nicht vorhanden waren. In meinem Fall war es eine
get_or_create
Methode in einer admin.py-Datei, die immer dann ausgeführt wurde, wenn die Software irgendeine Operation ausführte (in diesem Fall die Migration). Hoffe das hilft jemandem.quelle
Sie müssen zuerst das Schema hinzufügen, z
Wenn Sie das nicht in allen Abfragen hinzufügen möchten, versuchen Sie Folgendes:
Jetzt wird es funktionieren:
quelle
Die einfachste Problemumgehung besteht darin, einfach den Tabellennamen und alle Spaltennamen in Kleinbuchstaben zu ändern und Ihr Problem wird behoben.
Beispielsweise:
Table_Name
zutable_name
undColumnName
zucolumnname
quelle