在我的服务器代码中,有一个对_SO_fetchAlternateID的调用(嵌套在一些value调用中),该调用最终在makeConnection中调用pgconnection.py

此调用在conn.autocommit(1)上失败,并显示错误



这是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不是方法,而是 bool 值(False)。
self.module是模块'psycopg2'(2.4.2)。

这是配置问题吗?版本不匹配?

更新:

原因被证明是psycopg2-2.4.2中的不兼容问题。查看C源代码,psycopg/connection.h具有一个不幸地名为autocommit的整数变量。 2-2.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的上下文中是错误的,其中 makeConnection is a bool

正如您所提到的,在conn.autocommit(val)中采用了相同的假设,并且那里没有其他函数。

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

10-08 05:03