cx_Oracle:如何将每行作为字典接收?

Mar*_*son 9 python sql oop oracle cx-oracle

默认情况下,cx_Oracle将每一行作为元组返回.

>>> import cx_Oracle
>>> conn=cx_Oracle.connect('scott/tiger')
>>> curs=conn.cursor()
>>> curs.execute("select * from foo");
>>> curs.fetchone()
(33, 'blue')
Run Code Online (Sandbox Code Playgroud)

如何将每行作为字典返回?

Mar*_*son 16

您可以覆盖光标的rowfactory方法.每次执行查询时都需要执行此操作.

这是标准查询的结果,一个元组.

curs.execute('select * from foo')
curs.fetchone()
    (33, 'blue')
Run Code Online (Sandbox Code Playgroud)

返回一个命名元组:

def makeNamedTupleFactory(cursor):
    columnNames = [d[0].lower() for d in cursor.description]
    import collections
    Row = collections.namedtuple('Row', columnNames)
    return Row

curs.rowfactory = makeNamedTupleFactory(curs)
curs.fetchone()
    Row(x=33, y='blue')
Run Code Online (Sandbox Code Playgroud)

返回字典:

def makeDictFactory(cursor):
    columnNames = [d[0] for d in cursor.description]
    def createRow(*args):
        return dict(zip(columnNames, args))
    return createRow

curs.rowfactory = makeDictFactory(curs)
curs.fetchone()
    {'Y': 'brown', 'X': 1}
Run Code Online (Sandbox Code Playgroud)

感谢Amaury Forgeot d'Arc:http: //sourceforge.net/p/cx-oracle/mailman/message/27145597


mae*_*m73 11

A very short version:

curs.rowfactory = lambda *args: dict(zip([d[0] for d in curs.description], args))
Run Code Online (Sandbox Code Playgroud)

Tested on Python 3.7.0 & cx_Oracle 7.1.2

  • 将此行放在“curs.execute”之后对我有用。返回字典列表。谢谢。 (2认同)