【问题标题】:Python Database API Cursor.Description wont include Table namePython 数据库 API Cursor.Description 不会包含表名
【发布时间】:2014-01-20 16:03:06
【问题描述】:

数据库 API 文档在这里http://www.python.org/dev/peps/pep-0249/#description

如果我在python中使用MySQLdb做Table Join,那么可能会出现问题,

def query_db(query, args=(), one=False):
    cur = db.cursor()
    cur.execute(query, args)
    rv = [dict((cur.description[idx][0], value)
               for idx, value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv

result = query_db ('select table1.name, table2.name from table1 inner join table2 on table1.id = table2.id', one=True )
print result       
#{'name':'blah blah'}

最终结果将是一个只有一个键name的字典,那是因为cur.description没有表名的信息,只有表列名,所以table2.name覆盖了table1.name。

这是一个错误吗?

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

    您可以尝试使用 DictCursor。 这不是标准的 API 2.0。
    DictCursor 提供了一个字典接口,如果有两个同名的列,键是“column”或“table.column”。

    def query_db(query, args=(), one=False):
        cur = MySQLdb.cursors.DictCursor(db)
        cur.execute(query, args)
        rv = [row for row in cur]
        return (rv[0] if rv else None) if one else rv
    

    尽管如此,我建议在 SQL 中使用AS 的解决方法来为select 中的列指定别名。例如:

    select table1.name as `table1.name`, table2.name as `table2.name`
    from   table1 inner join table2
    on     table1.id = table2.id
    ...
    >>> cur.description
    (('table1.name', 253, 32, 32, 32, 0, 0), ('table2.name', 253, 18, 80, 80, 0, 0))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2013-08-11
      • 2017-12-19
      相关资源
      最近更新 更多