#postgresql #pygresql
Вопрос:
Я использую CentOS-6 с Python 3.8, PostgreSQL 12 и PyGreSQL 5.2.2. Это ошибка, которую я получаю, пытаясь вставить данные в свою базу данных.
>>> db.insert('settings', None, **data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/site-packages/pg.py", line 2322, in insert
adapt = params.add
File "/usr/local/lib/python3.8/site-packages/pg.py", line 1667, in __getattr__
if self.db:
AttributeError: 'pg.Connection' object has no attribute 'escape_identifier'
Может ли кто-нибудь указать мне на то, что не так?
Комментарии:
1. Попробуй без
None
этого .2. Использование этого оператора insert без None, как вы предлагали:
db.insert('settings', **data)
возвращает ту же ошибку, что и в исходном сообщении.
Ответ №1:
Метод escape_identifier
подключения соответствует функции PQescapeIdentifier
в libpq. Он существует с PostgreSQL 9, который требуется PyGreSQL 5.2. PyGreSQL не поддерживает поддержку этих функций, если он установлен с no-escaping-funcs
опцией или если он считает, что PostgreSQL старше версии 9.
Поскольку вы говорите, что у вас установлен PostgreSQL 12, возможным объяснением может быть то, что у вас все еще установлена клиентская библиотека ( libpq
) старой версии PostgreSQL, и pg_config
инструмент сообщает об этой старой версии. Вы должны проверить это с pg_config --version
помощью . pg_config
Инструмент libpq-devel
включен , поэтому убедитесь, что у вас есть libpq
и libpq-devel
установлен для PostgreSQL 12.
Вы также можете попытаться явно включить экранирующие функции , установив PyGreSQL с python setup.py build_ext --escaping-funcs install
помощью , но вам все равно понадобится последняя libpq
версия, и другие функции также будут отключены, когда PyGreSQL сочтет, что libpq слишком стар. Поэтому правильное решение состоит в том, чтобы убедиться libpq
, что он обновлен и pg_config --version
сообщает соответствующую версию PostgreSQL.
Комментарии:
1. Спасибо за информацию. У меня действительно установлен более старый PostgreSQL. Это версия 8.4. Я убедился, что мои ссылки верны:
/usr/lib/libpq.so --> /usr/pgsql-12/lib/libpq.so.5.12 /usr/lib/libpq.so.5 --> /usr/pgsql-12/lib/libpq.so.5.12
я также удалил /usr/bin/pg_config и вместо этого сделал ссылку:/usr/bin/pg_config --> /usr/pgsql-12/bin/pg_config
Запуск «pg_config —версия» теперь возвращает PostgreSQL 12.5, так что это правильно. Я не компилировал PyGreSQL вручную. Я установил через pip. Я все еще получаю ту же ошибку при вставке данных в БД. Есть еще какие-нибудь идеи для меня?2. Важно, чтобы вы установили PyGreSQL после внесения этих изменений. Если он уже установлен, удалите его (pip uninstall) и установите его снова, чтобы он был скомпилирован с более новым pqlib во время установки.
3. Большое спасибо. Переустановка pip сделала свое дело! Сейчас все работает.