Próbuję uruchomić następujący skrypt PHP, aby wykonać proste zapytanie do bazy danych:
$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());
Powoduje to następujący błąd:
Zapytanie nie powiodło się: BŁĄD: relacja „sf_bands” nie istnieje
We wszystkich przykładach, które mogę znaleźć, gdzie pojawia się błąd stwierdzający, że relacja nie istnieje, ponieważ używają wielkich liter w nazwie tabeli. Nazwa mojej tabeli nie zawiera wielkich liter. Czy istnieje sposób zapytania do mojej tabeli bez podania nazwy bazy danych, tj. showfinder.sf_bands
?
php
sql
postgresql
quoted-identifier
Keyslinger
źródło
źródło
Odpowiedzi:
Z tego, co przeczytałem, ten błąd oznacza, że nie odwołujesz się poprawnie do nazwy tabeli. Jednym z powszechnych powodów jest to, że tabela jest zdefiniowana pisownią z wielkimi i małymi literami, a Ty próbujesz wykonać zapytanie wszystkimi małymi literami.
Innymi słowy:
Używaj podwójnych cudzysłowów, aby rozgraniczać identyfikatory, abyś mógł używać określonej pisowni z mieszanymi literami w miarę definiowania tabeli.
Jeśli chodzi o Twój komentarz, możesz dodać schemat do „ścieżki_wyszukiwania”, aby po odwołaniu się do nazwy tabeli bez kwalifikowania jej schematu zapytanie dopasowało nazwę tabeli, sprawdzając kolejno każdy schemat. Podobnie jak
PATH
w powłoce lubinclude_path
w PHP itp. Możesz sprawdzić bieżącą ścieżkę wyszukiwania schematu:Możesz zmienić ścieżkę wyszukiwania schematu:
Zobacz także http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
źródło
SELECT * FROM SF_Bands
to nadal się nie powiedzie, ponieważ Postgres zdecyduje, że nazwa tabeli zostanie zapisana małymi literami. Dziwne ...Miałem z tym problemy i oto historia (smutna, ale prawdziwa):
Jeśli nazwa tabeli ma małe litery, takie jak: konta, których możesz użyć:
select * from AcCounTs
i będzie działać poprawnieJeśli nazwa tabeli ma małe litery, takie jak:
accounts
Następujące nie powiedzie się:select * from "AcCounTs"
Jeśli nazwa tabeli ma różne litery, takie jak:
Accounts
Następujące nie powiedzie się:select * from accounts
Jeśli nazwa tabeli ma różne litery, takie jak:
Accounts
Następujące będą działać OK:select * from "Accounts"
Nie lubię pamiętać takich bezużytecznych rzeczy, ale musisz;)
źródło
Accounts
, zawiedzieselect * from Accounts;
, znajduję najdziwniejszą część: ten sam przypadek NIE jest identyczny.Zapytanie przetwarzania Postgres różni się od innych RDMS. Umieść nazwę schematu w podwójnym cudzysłowie przed nazwą tabeli w ten sposób „SCHEMA_NAME”. „SF_Bands”
źródło
Umieść parametr dbname w ciągu połączenia. To działa dla mnie, podczas gdy wszystko inne zawiodło.
Również podczas wybierania określ
your_schema
.your_table
lubię to:źródło
Miałem podobny problem na OSX, ale próbowałem bawić się podwójnymi i pojedynczymi cudzysłowami. W twoim przypadku możesz spróbować czegoś takiego
źródło
To jest naprawdę pomocne
Znalazłem więcej problemów i dowiedziałem się, jak ustawić tę „ścieżkę wyszukiwania”, definiując nowego użytkownika w bieżącej bazie danych.
Otwórz właściwości bazy danych, a następnie otwórz arkusz „Zmienne” i po prostu dodaj tę zmienną dla użytkownika o rzeczywistej wartości.
Więc teraz twój użytkownik otrzyma tę nazwę schematu przez defoult i możesz użyć tableName bez schemaName.
źródło
Musisz wpisać nazwę schematu i nazwę tabeli w znaku qutotation. Jak poniżej:
źródło
Dla mnie problem polegał na tym, że użyłem zapytania do tej konkretnej tabeli podczas inicjalizacji Django. Oczywiście spowoduje to błąd, ponieważ te tabele nie istniały. W moim przypadku była to
get_or_create
metoda w pliku admin.py, która była wykonywana za każdym razem, gdy oprogramowanie uruchamiało jakąkolwiek operację (w tym przypadku migrację). Mam nadzieję, że komuś pomoże.źródło
Najpierw musisz dodać schemat, np
Jeśli nie chcesz dodawać tego do wszystkich zapytań, spróbuj tego:
Teraz będzie działać:
źródło
Najłatwiejszym obejściem jest po prostu zmiana nazwy tabeli i wszystkich nazw kolumn na małe litery, a problem zostanie rozwiązany.
Na przykład:
Table_Name
natable_name
iColumnName
nacolumnname
źródło