数据库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
这是一个错误吗?
答案 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))