在我的服務器代碼中,有一個調用_SO_fetchAlternateID
(嵌套在一些value
調用中),最終調用makeConnection
的pgconnection.py
。python:爲什麼SQLObject在conn.autocommit(1)中失敗?
該呼叫conn.autocommit(1)
失敗,並錯誤
TypeError: 'bool' object is not callable
這裏的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
調試表明,康恩確實擁有一個連接對象,但自動提交不是一種方法,而是一種布爾(假)。
self.module
是模塊'psycopg2'(2.4.2)。
這是配置問題嗎?不匹配的版本?
UPDATE:
病因原來是在psycopg2-2.4.2不兼容的問題。查看C源代碼,psycopg/connection.h有一個不幸名爲autocommit
的整型變量。版本2-2.4正常。
我看到了這段代碼。但我也調試了其他運行相同版本的SQLObject和psycopg2的其他計算機的代碼,其中'hasattr(conn,'autocommit')'爲False。 – Ovesh 2011-06-21 07:33:36
@Ovesh這很奇怪。'autocommit'(就像整個'connection'一樣)來自這個模塊的C源代碼,在這個源代碼中它被聲明爲'int'(對於Python,它是'bool',因爲C沒有任何明確的布爾類型)在'psycopg/connection.h'中。沒有辦法,它不會存在或是一個函數(如果你真的使用相同的代碼 - 也許一些導入失敗或'conn'是'None'?)。 – 2011-06-21 20:28:51
我非常肯定它的行爲方式我說它在其他機器上。但是,它們的版本略有不同:2-2.4而不是2-2.4.2。我沒有辦法在他們的機器上查看C源代碼,因爲它已經被編譯成了這樣的文件。 – Ovesh 2011-06-22 06:08:27