5

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

4

2 回答 2

5

您刚刚发现了一个错误。看看这段代码:

def _setAutoCommit(self, conn, auto):
    # psycopg2 does not have an autocommit method.
    if hasattr(conn, 'autocommit'):
        conn.autocommit(auto)

它假设conn(type: psycopg2.connection) 可能没有autocommit属性,但是当它有属性时,它必须是一个函数。在 的上下文中是错误的psycopg2.connection, wherepsycopg2.connection.autocommit是 bool

正如您提到的那样,采用了相同的假设makeConnection,其中几乎没有其他功能。

这可以通过将每个调用更改conn.autocommit(val)为 来解决conn.autocommit = val,这应该很容易,即使使用sed.

于 2011-06-20T07:51:47.207 回答
1

听起来像是有人分配autocommit = True给 conn 对象的代码中的某处。

当口译员到达:

 conn.autocommit(1) 

事实上,它评估:

 True(1) 

如果没有“自动提交”布尔键,请检查 self.dsn 或 self.dsn_dict 的内容。

于 2011-06-20T06:59:21.337 回答