2009-03-29 8 views
95

Ich versuche, das folgende PHP-Skript zu tun, um eine einfache Datenbank-Abfrage auszuführen:Kann einfach nicht PostgreSQL Tabellennamen verwenden („Beziehung existiert nicht“)

$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 erzeugt die folgenden Fehler:

Query failed: ERROR: relation "sf_bands" does not exist

In allen Beispielen kann ich finden, wo jemand einen Fehler erhält, der besagt, dass die Beziehung nicht existiert, weil sie Großbuchstaben in ihrem Tabellennamen verwenden. Mein Tabellenname hat keine Großbuchstaben. Gibt es eine Möglichkeit, meine Tabelle abzufragen, ohne den Datenbanknamen anzugeben, d. H. showfinder.sf_bands?

+2

Sind Sie sicher, dass die Tabelle sf_bands existiert? Funktioniert showfinder.sf_bands? –

+1

showfinder.sf_bands funktioniert einwandfrei – Keyslinger

+0

Vielleicht sollte ich beachten, dass meine Datenbank von MySQL migriert wurde – Keyslinger

Antwort

189

Von 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 folgendes nicht:

CREATE TABLE "SF_Bands" (...); 

SELECT * FROM sf_bands; -- ERROR! 

Verwenden doppelte Anführungszeichen Bezeichner abgrenzen, so dass Sie die spezifische Groß- und Klein Rechtschreibung verwenden können als die Tabelle definiert ist.

SELECT * FROM "SF_Bands"; 

Re Ihren Kommentar, können Sie ein Schema zum „search_path“ hinzufügen, so dass, wenn Sie einen Tabellennamen ohne Stärkung ihrer Schema verweisen, wird die Abfrage, die Tabellennamen jeder um Schema durch geprüft übereinstimmen . Genau wie PATH in der Schale oder include_path in PHP, etc. Sie können Ihren aktuellen Schema-Suchpfad überprüfen:

SET search_path TO showfinder,public; 

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

+0

Ups, vergib mir. Ich wollte sagen, dass mein Tabellenname keine Großbuchstaben hat, nicht mein Datenbankname. – Keyslinger

+9

Es scheint, dass selbst wenn Sie 'SELECT * FROM SF_Bands' eingeben, dies immer noch fehlschlägt, weil Postgres sich entschließt, diesen Tabellennamen für Sie klein zu schreiben. Seltsam ... –

+3

@romkyns: Ja, das ist eigentlich bei RDBMS-Marken ziemlich üblich, dass unbegrenzte Bezeichner als "case-insensitive" beworben werden. Aber sie sind nicht wirklich Groß-und Kleinschreibung, weil die Art, wie sie das implementiert haben, Kleinbuchstaben zu erzwingen. Dies entspricht nur dann dem Namen der Tabelle, wenn Sie bei der Definition der Tabelle den Tabellennamen als niedriger deklariert haben. Wenn Sie bei der CREATE TABLE-Anweisung Trennzeichen mit doppelten Anführungszeichen verwenden, müssen Sie Trennzeichen verwenden, wenn Sie sie in Abfragen referenzieren. –

9
:

SHOW search_path 
    "$user",public 

Sie können Ihren Schema-Suchpfad ändern

Setzen Sie den Parameter dbname in Ihre Verbindungszeichenfolge. Es funktioniert für mich, während alles andere fehlgeschlagen ist.

Geben Sie bei der Auswahl auch your_schema an. your_table wie folgt aus:

select * from my_schema.your_table 
+0

Setzen des Schemanamens z. my_schema.my_relation in die Abfrage half. – JoeTidee

+0

Vielen Dank! Es hilft mir, das Problem zu lösen! Aber gibt es eine Möglichkeit, dass ich den Namen des Schemas weglassen kann? – Charlotte

9

Postgres Prozess Abfrage unterscheidet sich von anderen RDMS. Setzen Sie den Schemanamen im doppelten Anführungszeichen vor Ihrem Tabellennamen wie "SCHEMA_NAME".„SF_Bands“

+4

Was fügt Ihre Antwort zu der zuvor angenommenen Antwort hinzu, die 22 Mal mit vielen Details aktualisiert wurde? – Yaroslav

41

hatte ich Probleme mit diesem und dies ist die Geschichte (traurig, aber wahr):

  1. Wenn Ihre Tabellennamen in Kleinbuchstaben ist wie: Konten Sie verwenden können: select * from AcCounTs und es wird funktionieren

  2. Wenn Ihre Tabellennamen in Kleinbuchstaben wie ist: accounts Im folgenden wird fehlschlagen: select * from "AcCounTs"

  3. Wenn Ihr Tabellenname gemischter Fall wie ist: Accounts Im Folgenden wird fehlschlagen: select * from accounts

  4. Wenn Ihr Tabellenname gemischter Fall ist wie: Accounts Die folgende OK arbeiten: select * from "Accounts"

Ich mag es nicht, nutzlose Dinge wie das zu erinnern, aber Sie müssen;)

+0

Das Gleiche gilt für Spaltennamen in Where-Klauseln – Roland

+5

5. Gemischte Groß-/Kleinschreibung, wie 'Accounts', wird mit' select * from Accounts fehlschlagen; 'Ich finde den seltsamsten Teil: same-case ist NICHT identisch. – Roland

+1

Alles da ist: Alle Namen in der Postgres-Abfrage sind Kleinbuchstaben, es sei denn, Sie verwenden Anführungszeichen. – Erndob

2

Ich hatte ein ähnliches Problem auf OSX aber versucht, aro zu spielen und mit doppelten und einfachen Anführungszeichen. Für Ihren Fall könnten Sie so etwas wie dieses

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

für mich versuchen, das Problem war, dass ich eine Anfrage an die betreffende Tabelle verwendet hatte, während Django initialisiert wurde. Natürlich wird dann ein Fehler ausgegeben, weil diese Tabellen nicht existierten. In meinem Fall war es eine get_or_create Methode innerhalb einer admin.py Datei, die ausgeführt wurde, wenn die Software irgendeinen Vorgang (in diesem Fall die Migration) ausführte. Hoffe das hilft jemandem.

Verwandte Themen