PyGreSQL — Не удается вставить данные

#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 сделала свое дело! Сейчас все работает.