Я пытаюсь запустить следующий 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
?
Из того, что я прочитал, эта ошибка означает, что вы неправильно ссылаетесь на имя таблицы. Одной из распространенных причин является то, что таблица определена с орфографией с смешанным регистром, и вы пытаетесь запросить ее со всеми строчными буквами.
Другими словами, выполняется следующее:
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 SF_Bands
это все равно не получится, потому что Postgres решит использовать для вас строчное имя таблицы. Weird ...
У меня были проблемы с этим, и это история (грустная, но правда):
Если ваше имя таблицы имеет все нижеследующее значение: учетные записи
вы можете использовать: select * from AcCounTs
, и он будет работать нормально
Если ваше имя таблицы имеет все нижний регистр, например: accounts
Не удалось выполнить следующее:
select * from "AcCounTs"
Если ваше имя таблицы смешанно, например: accounts
Не удалось выполнить следующее:
select * from 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"
Это очень полезно
SET search_path TO schema,public;
Я еще больше вычислил эти проблемы и узнал о том, как установить этот "путь поиска" с помощью defoult для нового пользователя в текущей базе данных.
Откройте "Свойства базы данных", затем откройте "Переменные" и просто добавьте эту переменную для своего пользователя с фактическим значением.
Итак, теперь ваш пользователь получит это имя_схемы defoult, и вы можете использовать tableName без schemaName.
Для меня проблема заключалась в том, что я использовал запрос к этой конкретной таблице, а Django был инициализирован. Разумеется, это приведет к ошибке, потому что этих таблиц не существует. В моем случае это был метод get_or_create
в файле admin.py, который выполнялся всякий раз, когда на программном обеспечении выполнялась какая-либо операция (в данном случае миграция). Надежда помогает кому-то.