python:为什么SQLObject在conn.autocommit(1)中失败?

时间:2011-06-16 15:09:16

标签: python psycopg2 sqlobject

在我的服务器代码中,有一个_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工作正常。

2 个答案:

答案 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.connectionpsycopg2.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的内容。