Нельзя просто использовать имя таблицы PostgreSQL («отношения не существует»)

Я пытаюсь запустить следующий скрипт 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.

У меня были проблемы с этим, и это история (грустная, но правда):

  1. Если имя вашей таблицы имеет нижний регистр, например: учетные записи, которые вы можете использовать: select * from AcCounTs и он будет работать нормально

  2. Если ваше имя таблицы имеет все нижеследующее значение, например: accounts Следующие select * from "AcCounTs" не будут выполнены: select * from "AcCounTs"

  3. Если ваше имя таблицы смешанно, например: Accounts : Accounts : select * from accounts

  4. Если ваше имя таблицы смешанно, например: 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, который выполнялся всякий раз, когда на программном обеспечении выполнялась какая-либо операция (в этом случае миграция). Надежда помогает кому-то.