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

122

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

  • 2
    Вы уверены, что таблица sf_bands существует? Работает ли showfinder.sf_bands?
  • 1
    showfinder.sf_bands работает отлично
Показать ещё 3 комментария
Теги:
database
quoted-identifier

7 ответов

200
Лучший ответ

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

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

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

  • 0
    Ой, прости меня. Я хотел сказать, что в имени моей таблицы нет заглавных букв, а не имя базы данных.
  • 11
    Похоже, что даже если вы SELECT * FROM SF_Bands это все равно не получится, потому что Postgres решит использовать для вас строчное имя таблицы. Weird ...
Показать ещё 6 комментариев
50

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

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

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

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

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

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

  • 0
    То же самое для имен столбцов в выражениях where
  • 6
    5. Смешанный регистр, как и Accounts , потерпит неудачу, select * from Accounts; Я нахожу самую странную часть: один и тот же случай НЕ идентичен.
Показать ещё 2 комментария
12

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

  • 5
    Что добавляет ваш ответ к ранее принятому ответу, проголосовав 22 раза и с большим количеством деталей?
9

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

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

select * from my_schema.your_table
  • 0
    Помогло помещение имени схемы, например my_schema.my_relation в запрос.
  • 0
    Большое спасибо! Это действительно помогает мне решить проблему! Но есть ли способ, которым я могу опустить имя схемы?
3

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

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"
  • 0
    Это очень хороший ответ! Спасибо.
0

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

SET search_path TO schema,public;

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню