Нельзя просто использовать имя таблицы 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?

2907   7  

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

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

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

  2. если ваше имя таблицы все строчные, как:accounts Следующее не удастся: select * from "AcCounTs"

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

  4. если ваше имя таблицы это смешанный случай как : 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

    Ничего не найдено.