python: почему SQLObject не работает в conn.autocommit(1)?

В моем коде сервера есть вызов _SO_fetchAlternateID (вложенный в некоторых value вызов), который в конечном итоге вызывает makeConnection в pgconnection.py,

Этот вызов не работает на conn.autocommit(1)с ошибкой

Ошибка типа: объект 'bool' не вызывается

Вот код SQLObject (0.8.7):

def makeConnection(self):
try:
    if self.use_dsn:
        conn = self.module.connect(self.dsn)
    else:
        conn = self.module.connect(**self.dsn_dict)
except self.module.OperationalError, e:
    raise self.module.OperationalError("%s; used connection string %r" % (e, self.dsn))
if self.autoCommit:
    # psycopg2 does not have an autocommit method.
    if hasattr(conn, 'autocommit'):
        conn.autocommit(1)
return conn

Отладка показывает, что conn действительно содержит объект подключения, но autocommit - это не метод, а логический (False).

self.module это модуль 'psycopg2' (2.4.2).

Это проблема конфигурации? несовпадающие версии?

ОБНОВИТЬ:

Причиной оказывается проблема несовместимости в psycopg2-2.4.2. Глядя на исходный код C, psycopg/connection.h имеет целочисленную переменную, которая, к сожалению, называется autocommit, Версия 2-2.4 работает нормально.

2 ответа

Решение

Вы только что обнаружили ошибку. Посмотрите на этот код:

def _setAutoCommit(self, conn, auto):
    # psycopg2 does not have an autocommit method.
    if hasattr(conn, 'autocommit'):
        conn.autocommit(auto)

Предполагается, что conn (тип: psycopg2.connection) может не иметь autocommit свойство, но когда оно есть, оно должно быть функцией. Это неправильно в контексте psycopg2.connection, где psycopg2.connection.autocommit это бул.

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

Это можно исправить, изменив каждый вызов как conn.autocommit(val) в conn.autocommit = val, что должно быть легко, даже с sed,

Похоже, что где-то в коде кто-то назначить autocommit = True к объекту conn.

Когда переводчик достигнет:

 conn.autocommit(1) 

На самом деле это оценивает:

 True(1) 

Проверьте содержимое self.dsn или self.dsn_dict, если нет логического ключа 'autocommit'.

Другие вопросы по тегам