Python数据库API Cursor.Description不包含表名

时间:2014-01-20 16:03:07

标签: python mysql mysql-python

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

如果我使用MySQLdb在python中进行表连接,则可能存在问题,

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

这是一个错误吗?

1 个答案:

答案 0 :(得分: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

尽管如此,我建议使用AS在SQL中使用解决方法来为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))