2009-03-29 18 views
95

Sto cercando di eseguire il seguente script PHP per fare una semplice query di database:Non si può semplicemente utilizzare PostgreSQL nome della tabella ("relazione non esiste")

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

Questo produce il seguente errore:

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

In tutti gli esempi posso trovare dove qualcuno riceve un errore affermando che la relazione non esiste, è perché usano lettere maiuscole nel nome della tabella. Il mio nome di tabella non ha lettere maiuscole. C'è un modo per interrogare la mia tabella senza includere il nome del database, ad esempio showfinder.sf_bands?

+2

Sei sicuro che la tabella sf_bands esiste? Funziona showfinder.sf_bands? –

+1

showfinder.sf_bands funziona perfettamente – Keyslinger

+0

Forse dovrei notare che il mio database è stato migrato da MySQL – Keyslinger

risposta

189

Da quello che ho letto, questo errore indica che non stai facendo riferimento al nome della tabella correttamente. Un motivo comune è che la tabella viene definita con un'ortografia a caso misto e si sta tentando di eseguire una query con tutte le lettere minuscole.

In altre parole, il seguente esito negativo:

CREATE TABLE "SF_Bands" (...); 

SELECT * FROM sf_bands; -- ERROR! 

utilizzare le virgolette doppie per delimitare gli identificatori in modo da poter utilizzare la specifica mixed-case ortografico durante la tabella è definita.

SELECT * FROM "SF_Bands"; 

Re tuo commento, è possibile aggiungere uno schema alla "search_path" in modo che quando si fa riferimento un nome di tabella, senza qualificazione relativo schema, la query corrisponderà quel nome tabella controllato ogni schema, al fine . Proprio come PATH nella shell o include_path in PHP, ecc È possibile controllare il percorso corrente di ricerca schema:

SHOW search_path 
    "$user",public 

È possibile modificare lo schema percorso di ricerca:

SET search_path TO showfinder,public; 

Vedi anche http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

+0

Oops, perdonami. Volevo dire che il mio nome di tabella non ha lettere maiuscole, non il mio nome di database. – Keyslinger

+9

Sembra che anche se si digita 'SELECT * FROM SF_Bands' questo fallirà, perché Postgres decide di mettere in minuscolo quel nome tabella per te. Weird ... –

+3

@romkyns: Sì, questo è in realtà piuttosto comune tra i marchi RDBMS, che gli identificatori non identificati sono pubblicizzati come "maiuscole e minuscole". Ma non sono realmente insensibili alle maiuscole e alle minuscole perché il modo in cui sono implementati è quello di forzare le lettere minuscole. Questo corrisponde al nome della tabella solo se hai permesso che il nome della tabella fosse in minuscolo quando hai definito la tabella. Se si utilizzano i delimitatori a virgolette doppie quando si CREA TABELLA, è necessario utilizzare i delimitatori quando si fa riferimento nelle query. –

9

Inserisci il parametro dbname nella stringa di connessione. Funziona per me mentre tutto il resto fallisce.

Inoltre, durante la selezione, specificare your_schema. your_table simili:

select * from my_schema.your_table 
+0

Inserendo il nome dello schema, ad es. my_schema.my_relation nella query ha aiutato. – JoeTidee

+0

Grazie mille! Reall mi aiuta a risolvere il problema! Ma c'è un modo in cui posso omettere il nome dello schema? – Charlotte

9

Postgres interrogazione processo diverso dagli altri RDMS. Inserisci il nome dello schema tra virgolette prima del nome della tabella in questo modo, "SCHEMA_NAME"."SF_Bands"

+4

Cosa aggiunge la tua risposta alla risposta precedentemente accettata, ingrandita 22 volte e con molti dettagli? – Yaroslav

41

ho avuto problemi con questo e questa è la storia (triste ma vero):

  1. Se il nome della tabella è tutto in minuscolo come: account è possibile utilizzare: select * from AcCounTs e sarà funzionare bene

  2. Se il nome della tabella è tutto in minuscolo come: accounts Di seguito fallirà: select * from "AcCounTs"

  3. Se il nome della tabella è maiuscole e minuscole come: Accounts Di seguito avrà esito negativo: select * from accounts

  4. Se il nome della tabella è maiuscole e minuscole come: Accounts Di seguito funzionerà OK: select * from "Accounts"

Non mi piace ricordare cose inutili come questa, ma devi farlo;)

+0

Lo stesso vale per i nomi delle colonne in clausole where – Roland

+5

5. Il caso misto, come 'Account', fallirà con' select * from Accounts; 'Trovo la parte più strana: lo stesso caso NON è identico. – Roland

+1

Tutto quello che c'è da fare: tutti i nomi nella query postgres sono in minuscolo, a meno che non si utilizzino le virgolette. – Erndob

2

Ho avuto un problema simile su OSX ma ho provato a giocare aro und con virgolette doppie e singole. Per il vostro caso, si potrebbe provare qualcosa di simile

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

Per me il problema era che io avevo usato una query per quel particolare tavolo mentre Django è stato inizializzato. Ovviamente genererà quindi un errore, perché quelle tabelle non esistevano. Nel mio caso, era un metodo get_or_create all'interno di un file admin.py, che veniva eseguito ogni volta che il software eseguiva qualsiasi tipo di operazione (in questo caso la migrazione). Spero che aiuti qualcuno.

Problemi correlati