Нельзя просто использовать имя таблицы 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());
это приводит к следующей ошибке:
ошибка запроса: ошибка: отношение "sf_bands" не существует
во всех примерах я могу найти, где кто-то получает ошибку о том, что связь не существует, это потому, что они используют прописные буквы в имени своей таблицы. Мое имя таблицы не имеет прописных букв. Есть ли способ запросить мою таблицу без включения имени базы данных, т. е. showfinder.sf_bands?
7 ответов:
из того, что я прочитал, эта ошибка означает, что вы не ссылаетесь на имя таблицы правильно. Одна из распространенных причин заключается в том, что таблица определяется со смешанным написанием, и вы пытаетесь запросить ее со всеми строчными буквами.
другими словами, следующее терпит неудачу:
CREATE TABLE "SF_Bands" ( ... ); SELECT * FROM sf_bands; -- ERROR!используйте двойные кавычки для разграничения идентификаторов, чтобы вы могли использовать конкретное смешанное написание, как определено в таблице.
SELECT * FROM "SF_Bands";
Re ваш комментарий, вы можете добавить схему в "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
у меня были проблемы с этим и это история (печальная, но правдивая) :
если ваше имя таблицы все строчные, как: счета вы можете использовать:
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"
для меня проблема заключалась в том, что я использовал запрос к этой конкретной таблице во время инициализации Django. Конечно, это вызовет ошибку, потому что эти таблицы не существовали. В моем случае это было
get_or_createметод в пределах a admin.py файл, который выполнялся всякий раз, когда программное обеспечение выполняло какую-либо операцию (в данном случае миграцию). Надеюсь, это кому-то поможет.
Это очень полезным
SET search_path TO schema,public;я копал эту проблему больше, и узнал о том, как установить этот "search_path" по defoult для нового пользователя в текущей базе данных.
открыть Свойства базы данных, затем открыть лист " переменные" и просто добавьте эту переменную для вашего пользователя с фактическим значением.
Так что теперь ваш пользователь получит это schema_name по умолчанию, и вы можете использовать tableName без schemaName.
Comments