Psycopg2 не любит имена таблиц, начинающиеся с буквы нижнего регистра

Я запускаю ActivePython 2.6.5.12 ActiveState и PostgreSQL 9.0 Beta 1 под Windows XP.

Если я создаю таблицу с первой буквой в верхнем регистре (например, Книги), psycopg2 возвращает сообщение об ошибке «Ошибка программирования: отношение»: «не существует» при запуске оператора select: execute("SELECT * FROM Books") . Такая же ошибка возвращается, если я запускаю: execute("SELECT * FROM books") . Однако, если я изменил таблицу на имя нижнего регистра (то есть книги), то работает любое из приведенных выше утверждений.

Имя таблиц должно иметь имя в нижнем регистре? Является ли это настройкой или функцией или ошибкой? Мне что-то не хватает?

3 Solutions collect form web for “Psycopg2 не любит имена таблиц, начинающиеся с буквы нижнего регистра”

Прочтите «Идентификаторы и ключевые слова» из руководства, особенно часть о «цитируемых идентификаторах».

Чтобы добавить к другому ответу, поведение Postresql о case-sentivity идентификаторов (имена таблиц и имена столбцов):

  • Если имя не указано, оно преобразуется в нижний регистр . В противном случае это останется нетронутым.
  • После этого выполняется попытка проверки чувствительности к регистру .

Это относится не только к запросам, но и к манипулированию схемой; в частности: создание таблицы.

Золотое правило – последовательность :

Если вы хотите писать переносные приложения, вам рекомендуется всегда указывать определенное имя или никогда не цитировать его

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

Обычно все работает так, как ожидалось.

 db=# create table Xxx (id integer); -- unquoted, will be converted to lowercase CREATE TABLE db=# select * from xXx; -- this works ok id ---- (0 rows) db=# create table "Xxxx" (id integer); -- will be left untouched CREATE TABLE db=# select * from xxxx; -- bad ERROR: relation "xxxx" does not exist LINE 1: select * from xxxx; db=# select * from Xxxx; -- bad ERROR: relation "xxxx" does not exist LINE 1: select * from Xxxx; ^ db=# select * from "Xxxx"; -- ok id ---- (0 rows) db=# \dt *xx* List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | Xxxx | table | postgres public | xxx | table | postgres 

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

Решение, которое я нашел, – это использовать

 from psycopg2.extensions import AsIs 

и затем поместить имя столбца в переменную, например:

 column_name = '"Column_Mixed_Case"'#Mind the '" quotes combination ! 

и передать переменную в sql следующим образом

 data = AsIs(column_name) sql = "select %s from table" cur.execute(sql,data) 
  • Сравнение строк в таблице оракула и сопоставление обновлений
  • как получить единственный результат из SQLite-запроса в python?
  • сделать python ждать, пока хранимая процедура завершит выполнение
  • Насколько подходит выбор RethinkDB вместо традиционного SQL для JSON API?
  • Как указать таблицы FROM в подзапросах SQLAlchemy?
  • SQL Update, но используя pyodbc
  • Как очистить комментарии от сырого файла sql
  • Подсчет отношений в SQLAlchemy
  • Python - лучший язык программирования в мире.