python: почему SQLObject не работает в conn.autocommit (1)? - PullRequest
4 голосов
/ 16 июня 2011

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

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

TypeError: объект 'bool' не вызывается

Вот SQLObject's (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 ]

4 голосов
/ 20 июня 2011

Вы только что обнаружили ошибку.Взгляните на этот код:

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 - это bool .

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

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

1 голос
/ 20 июня 2011

Похоже, что где-то в коде кто-то присваивает autocommit = True объекту conn.

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

 conn.autocommit(1) 

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

 True(1) 

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

...