在我的服务器代码中,有一个对_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,这也应该很容易。