Невозможно просто использовать имя таблицы PostgreSQL («связь не существует») - PullRequest
141 голосов
/ 30 марта 2009

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

Это приводит к следующей ошибке:

Запрос не выполнен: ОШИБКА: отношение "sf_bands" не существует

Во всех примерах я могу найти, где кто-то получает сообщение о том, что отношения не существуют, потому что они используют заглавные буквы в имени таблицы. Имя моей таблицы не имеет заглавных букв. Есть ли способ сделать запрос к моей таблице без указания имени базы данных, то есть showfinder.sf_bands?

Ответы [ 7 ]

245 голосов
/ 30 марта 2009

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

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

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

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

SELECT * FROM "SF_Bands";

В своем комментарии вы можете добавить схему в «search_path», чтобы при обращении к имени таблицы без указания ее схемы запрос совпадал с именем таблицы, проверяя каждую схему по порядку. Также как 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

59 голосов
/ 03 сентября 2012

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

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

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

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

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

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

13 голосов
/ 11 июля 2012

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

12 голосов
/ 03 марта 2011

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

Также при выполнении выбора укажите your_schema. your_table, например:

select * from my_schema.your_table
4 голосов
/ 05 февраля 2015

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

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"
1 голос
/ 16 июня 2018

Это действительно полезно

SET search_path TO schema,public;

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

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

Так что теперь ваш пользователь получит это имя_схемы по умолчанию, и вы можете использовать имя_таблицы без имени_схемы.

0 голосов
/ 05 апреля 2016

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

...