代码之家  ›  专栏  ›  技术社区  ›  Jay Taylor shabeer90

Django后端中性dictcursor

  •  5
  • Jay Taylor shabeer90  · 技术社区  · 16 年前

    有没有办法在django中获得后端中立的字典游标?这将是一个游标,它是一个dict而不是一个tuple。我被迫用甲骨文做我正在做的学校项目。

    在python的mysqldb模块中,它被称为dictcursor。

    在沃尔夫鼓舞人心的建议下,我知道我已经很接近了。

    def dict_cursor(cursor):
        for row in cursor:
            yield dict(zip(cursor.description, row))
    

    迭代并打印用于生成以下结果的每一行光标:

    (482072, 602592, 1)
    (656680, 820855, 2)
    (574968, 718712, 4)
    (557532, 696918, 3))
    

    但是有了dict_cursor我得到:

    {('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 482072, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 1, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 602592}
    {('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 656680, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 2, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 820855}
    {('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 574968, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 4, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 718712}
    {('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 557532, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 3, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 696918}
    

    我只希望它使用密钥,例如“net-spend”。

    在进一步完善之后,这似乎起到了作用:

    def dict_cursor(cursor):
        for row in cursor:
            out = {}
            for i,col in enumerate(cursor.description):
                out[col[0]] = row[i]
            yield out
    

    -

    {'NET_COLLECTED': 602592, 'NET_SPENT': 482072, 'LOT': 1}
    {'NET_COLLECTED': 820855, 'NET_SPENT': 656680, 'LOT': 2}
    {'NET_COLLECTED': 718712, 'NET_SPENT': 574968, 'LOT': 4}
    {'NET_COLLECTED': 696918, 'NET_SPENT': 557532, 'LOT': 3}
    
    1 回复  |  直到 16 年前
        1
  •  6
  •   Wolph    16 年前

    你可以写几行:)

    def dict_cursor(cursor):
        description = [x[0] for x in cursor.description]
        for row in cursor:
            yield dict(zip(description, row))
    

    或者如果你真的想节省空间:

    simplify_description = lambda cursor: [x[0] for x in cursor.description]
    dict_cursor = lambda c, d: dict(zip(d, r) for r in c))