Psycopg2 не любит имена таблиц, которые начинаются со строчной буквы - PullRequest
6 голосов
/ 05 мая 2010

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

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

Предполагается, что имя таблицы должно иметь имя в нижнем регистре?Это настройка, функция или ошибка?Я что-то упускаю из виду?

Ответы [ 3 ]

8 голосов
/ 05 мая 2010

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

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

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

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

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

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

Обычно все работает как положено.

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
7 голосов
/ 05 мая 2010

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

2 голосов
/ 04 июня 2015

Мне часто приходится использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...