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

Я пытаюсь запустить следующий PHP script, чтобы выполнить простой запрос к базе данных:

$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?

Ответ 1

Из того, что я прочитал, эта ошибка означает, что вы неправильно ссылаетесь на имя таблицы. Одной из распространенных причин является то, что таблица определена с орфографией с смешанным регистром, и вы пытаетесь запросить ее со всеми строчными буквами.

Другими словами, выполняется следующее:

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

Ответ 2

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

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

  • Если ваше имя таблицы имеет все нижний регистр, например: accounts Не удалось выполнить следующее: select * from "AcCounTs"

  • Если ваше имя таблицы смешанно, например: accounts Не удалось выполнить следующее: select * from AcCounTs

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

Мне не нравится вспоминать бесполезные вещи вроде этого, но вам нужно;)

Ответ 3

Поместите параметр dbname в строку подключения. Это работает для меня, пока все остальное не удалось.

Также при выполнении выбора укажите your_schema. your_table следующим образом:

select * from my_schema.your_table

Ответ 4

Запрос процесса Postgres отличается от другого RDMS. Поместите имя схемы в двойную кавычку до имени вашей таблицы, например "SCHEMA_NAME". "SF_Bands"

Ответ 5

У меня была аналогичная проблема с OSX, но я старался играть с двойными и одинарными кавычками. В вашем случае вы можете попробовать что-то вроде этого

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

Ответ 6

Это очень полезно

SET search_path TO schema,public;

Я еще больше вычислил эти проблемы и узнал о том, как установить этот "путь поиска" с помощью defoult для нового пользователя в текущей базе данных.

Откройте "Свойства базы данных", затем откройте "Переменные" и просто добавьте эту переменную для своего пользователя с фактическим значением.

Итак, теперь ваш пользователь получит это имя_схемы defoult, и вы можете использовать tableName без schemaName.

Ответ 7

Для меня проблема заключалась в том, что я использовал запрос к этой конкретной таблице, а Django был инициализирован. Разумеется, это приведет к ошибке, потому что этих таблиц не существует. В моем случае это был метод get_or_create в файле admin.py, который выполнялся всякий раз, когда на программном обеспечении выполнялась какая-либо операция (в данном случае миграция). Надежда помогает кому-то.

Ответ 8

Вы должны написать имя схемы и имя таблицы в кавычках. Как показано ниже:

select * from "schemaName"."tableName";