Я пытаюсь запустить следующий скрипт PHP, чтобы выполнить простой запрос к базе данных:
$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());
Это приводит к следующей ошибке:
Ошибка запроса: ERROR: отношения "sf_bands" не существует
Во всех примерах я могу найти, где кто-то получает ошибку, указывающую, что отношения не существует, потому что они используют заглавные буквы в имени своей таблицы. В моем имени таблицы нет заглавных букв. Есть ли способ запросить мою таблицу без включения имени базы данных, то есть showfinder.sf_bands
?
Из того, что я прочитал, эта ошибка означает, что вы неправильно ссылаетесь на имя таблицы. Одной из распространенных причин является то, что таблица определена с орфографией с смешанным регистром, и вы пытаетесь запросить ее со всеми строчными буквами.
Другими словами, следующее не выполняется:
CREATE TABLE "SF_Bands" ( ... ); SELECT * FROM sf_bands; -- ERROR!
Используйте двойные кавычки, чтобы разграничить идентификаторы, чтобы вы могли использовать конкретную орфографию с смешанным регистром, поскольку таблица определена.
SELECT * FROM "SF_Bands";
Повторите свой комментарий, вы можете добавить схему в «путь поиска», чтобы при ссылке на имя таблицы без квалификации ее схемы запрос соответствовал этому имени таблицы, проверив каждую схему в порядке. Точно так же, как PATH
в оболочке или include_path
в PHP и т. Д. Вы можете проверить свой текущий путь поиска схемы:
SHOW search_path "$user",public
Вы можете изменить путь поиска схемы:
SET search_path TO showfinder,public;
См. Также http://www.postgresql.org/docs/8.3/static/ddl-schemas.html.
У меня были проблемы с этим, и это история (грустная, но правда):
Если имя вашей таблицы имеет нижний регистр, например: учетные записи, которые вы можете использовать: select * from AcCounTs
и он будет работать нормально
Если ваше имя таблицы имеет все нижеследующее значение, например: accounts
Следующие select * from "AcCounTs"
не будут выполнены: select * from "AcCounTs"
Если ваше имя таблицы смешанно, например: Accounts
: Accounts
: select * from accounts
Если ваше имя таблицы смешанно, например: Accounts
Следующие будут работать нормально: select * from "Accounts"
Я не люблю вспоминать бесполезные вещи, как это, но вы должны;)
Запрос процесса Postgres отличается от других RDMS. Поместите имя схемы в двойную кавычку перед именем вашей таблицы, например «SCHEMA_NAME». «SF_Bands»
Поместите параметр dbname в строку подключения. Это работает для меня, пока все остальное не удалось.
Также, когда вы делаете выбор, укажите your_schema
. your_table
:
select * from my_schema.your_table
У меня была аналогичная проблема с OSX, но я старался играть с двойными и одинарными кавычками. В вашем случае вы можете попробовать что-то вроде этого
$query = 'SELECT * FROM "sf_bands"'; NOTE: double quotes on "sf_Bands"
Для меня проблема заключалась в том, что я использовал запрос к этой конкретной таблице, а Django был инициализирован. Разумеется, это приведет к ошибке, потому что этих таблиц не существует. В моем случае это был метод get_or_create в файле admin.py, который выполнялся всякий раз, когда на программном обеспечении выполнялась какая-либо операция (в этом случае миграция). Надежда помогает кому-то.