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) 
  • Pandon Pandas - использование to_sql для записи больших кадров данных в кусках
  • Набор запросов Django-фильтра на «кортежи» значений для нескольких столбцов
  • Извлеченный первичный ключ Обработка ошибок в Python / psycopg2
  • Как присоединиться к трем таблицам с SQLalchemy и сохранить все столбцы в одной из таблиц?
  • Beatbox: Как добавить функцию OR в предложение WHERE при извлечении данных из SFDC?
  • Django query: "datetime + delta" как выражение
  • Python DB-API: как обрабатывать разные paramstyles?
  • Получить количество строк в таблице с помощью SQLAlchemy
  • Сохранение вывода SQL Query в Python Variable
  • Я бы хотел, чтобы некоторые советы, почему это не будет вставлять данные в мою таблицу SQL
  • как выполнить внутреннее или внешнее соединение DataFrames с Pandas по не упрощенному критерию
  •  
    Interesting Posts for Van-Lav

    Инициализация многомерного массива Python без цикла

    Получить размер базы данных Rethinkdb с помощью Python

    как писать новую ячейку в python с помощью openpyxl

    Объект 'module' не имеет атрибута 'choice' – пытается использовать random.choice

    сообщение на страницу для входа в систему с помощью красивого супа

    извлечение характеристик основного тона из аудиофайла

    Замораживание программы во время выполнения функции в Tkinter

    Как профилировать мой код?

    Почему значения словаря переопределяются в конце этого цикла?

    Как получить более высокую скорость при использовании многопоточности в python

    Python 3.2 tkinter создает рамку результатов для вывода вывода

    Есть ли функция в Django / Python, похожая на PHP flush (), которая позволяет мне отправлять часть ответа HTTP клиентам?

    Как сравнить пароль обычного текста с хешированным паролем с помощью bcrypt?

    Извлечение содержимого из каталога на сетевом диске (Windows)

    Параметры структуры данных для эффективного хранения наборов целых пар на диске?

    Python - лучший язык программирования в мире.