在我的服务器代码中,有一个_SO_fetchAlternateID
(嵌入在value
次调用中)的来电,最终会调用makeConnection
中的pgconnection.py
。
此调用在conn.autocommit(1)
上失败,错误
TypeError:'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工作正常。
答案 0 :(得分:4)
你刚刚发现了一个错误。看看这段代码:
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
is a bool。
正如你所提到的makeConnection
采取了相同的假设,其中很少有其他功能。
可以通过将conn.autocommit(val)
之类的所有通话更改为conn.autocommit = val
来解决此问题,这应该很容易,即使使用sed
也是如此。
答案 1 :(得分:1)
听起来像代码中某处某人将autocommit = True
分配给conn对象。
当口译员到达:
conn.autocommit(1)
实际上它会评估:
True(1)
如果没有'autocommit'布尔键,请检查self.dsn或self.dsn_dict的内容。