cursor_factory = None引发异常

时间:2014-04-25 11:34:49

标签: python cursor psycopg2

我在psycopg2类中包含了DB连接,其中一种方法是获取游标。我还在其参数中添加了cursor_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作为默认值,就像documentation所说的那样:

cursor(name=None, cursor_factory=None, scrollable=None, withhold=False)

1 个答案:

答案 0 :(得分:1)

事实上,似乎connection.cursor() implementation无法处理cursor_factory参数设置为None

代码不会检查factory是否设置为Py_None并且无论如何都要调用它。如果没有给出关键字参数,则使用connection.cursor_factory代替,根据来源,默认设置为extensions.cursor(例如psycopg2._psycopg.cursor)。

您可以通过测试None并在这种情况下使用connection.cursor_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或更新版本; connection.cursor_factory was added in that version

对于以前的版本,只需使用psycopg2._psycopg.cursor代替self.conn.cursor_factory