SQLAlchemy返回元组而不是字典

时间:2010-05-13 15:54:55

标签: python sqlalchemy

我已将SQLAlchemy更新为0.6,但它打破了一切。我注意到它不再返回字典而不是字典了。这是一个示例查询:

query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1)
result = session.execute(query).fetchone()

这段代码用于返回0.5中的字典。

我的问题是如何归还字典?

3 个答案:

答案 0 :(得分:36)

session.execute从未返回过dict,它返回一个RowProxy对象,可以使用整数键进行位置查找,使用字符串键进行基于标签的查找或列对象,将索引为 dict查找该列的值。这里的问题是session.execute(query)没有做你想象的那样。它将Query对象转换为Select语句,执行该语句并直接返回结果。结果集对ORM级别功能一无所知。 0.5和0.6之间的变化是ORM使用不同的算法来标记查询中的列,它现在将表名添加到标签之前。因此,当以前row['id']正好工作时,现在row['users_id']正常工作。在这两种情况下row[User.__table__.columns['id']]都有效。

要执行ORM查询,您应该实际使用.all().first().one()方法,或者对其进行迭代或使用数字索引。查询返回名为tuple的对象。如果你想要一个字典,请用元素键来元组:

row = session.query(User.id, User.username, User.email)\
    .filter(and_(User.id == id, User.username == username)).first()
print("id=%s username=%s email=%s" % row) # positional
print(row.id, row.username) # by label
print(dict(zip(row.keys(), row))) # as a dict

答案 1 :(得分:9)

你打算打印它时,你确定它不是假装成元组的ResultProxy吗? ORM中的许多对象不是他们的__str__函数返回的对象。

答案 2 :(得分:7)

这应该有效: dict(zip(['id','username','email'],result))(如果您使用的是Python 3.x,则可以使用字典理解)。
此外,您无需在session.execute对象上调用session.query。您需要在其上使用.one()方法。这也可以避免在查询结束时挂起.limit(1)电话。