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'.