Python cursor\u factory=None引发异常
我将我的Python cursor\u factory=None引发异常,python,cursor,psycopg2,Python,Cursor,Psycopg2,我将我的psycopg2连接包装在DB类中,其中一个方法是获取游标。我还在其参数中添加了一个cursor\u factory,但是当使用None作为默认值时,会产生一个错误 class DB: ... connection code and other stuff ... def fetchcursor(self, query, params, in_cursor_factory=None): cur = self.conn.cursor(cursor_fac
psycopg2
连接包装在DB
类中,其中一个方法是获取游标。我还在其参数中添加了一个cursor\u factory
,但是当使用None
作为默认值时,会产生一个错误
class DB:
... connection code and other stuff ...
def fetchcursor(self, query, params, in_cursor_factory=None):
cur = self.conn.cursor(cursor_factory=in_cursor_factory)
cur.execute(query, params)
return cur
db = DB()
db.fetchcursor("SELECT * FROM foo", None)
我得到的错误是:
TypeError: 'NoneType' object is not callable
当我将None
替换为psycopg2.extras.DictCursor
时,它可以工作。我想使用None
作为默认值,正如上面所说:
实际上,似乎无法很好地将
游标\u工厂
参数设置为None
代码不会检查是否将factory
设置为Py_None
,并将其调用。如果未提供关键字参数连接,则将使用游标工厂,根据源代码,默认情况下,该工厂设置为扩展名.cursor
(例如psycopg2.\u psycopg.cursor
)
您可以通过测试None
并使用connection.cursor\u factory
进行复制,在这种情况下:
def fetchcursor(self, query, params, in_cursor_factory=None):
if in_cursor_factory is None:
in_cursor_factory = self.conn.cursor_factory
cur = self.conn.cursor(cursor_factory=in_cursor_factory)
cur.execute(query, params)
return cur
这假定您使用的是psycopg
2.5版或更高版本<代码>连接。光标\工厂
对于以前的版本,只需使用psycopg2.\u psycopg.cursor
而不是self.conn.cursor\u factory
,AttributeError:“psycopg2.\u psycopg.connection”对象没有属性“cursor\u factory”
@BartFriederichs:这是psycopg2
的哪个版本?源代码和两者都显示属性应该存在。@BartFriederichs:文档中确实说明了它是在版本2.5中引入的。@BartFriederichs:进一步研究,将psycopg2.\u psycopg.cursor
替换为<2.5版本。正如Martijn指出的,这是psycopg的一个缺点。将其固定在2.5.3中。
def fetchcursor(self, query, params, in_cursor_factory=None):
if in_cursor_factory is None:
in_cursor_factory = self.conn.cursor_factory
cur = self.conn.cursor(cursor_factory=in_cursor_factory)
cur.execute(query, params)
return cur