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 中返回一个字典。

我的问题是如何返回字典?

原文由 Ivan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

这应该有效: dict(zip(['id','username','email'],result)) (或者如果你使用的是 Python 3.x,你可以使用字典理解)。

此外,您不需要在 session.query 对象上调用 session.execute 。您需要使用 .one() 方法来代替。这也避免了 .limit(1) 调用在查询结束时挂起的需要。

原文由 yarmiganosca 发布,翻译遵循 CC BY-SA 2.5 许可协议

session.execute 从未返回字典,它返回一个 RowProxy 对象,可以 字典一样使用整数键进行位置查找、字符串键进行基于标签的查找或 Column 对象来查找该列的值。这里的问题是 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() 方法或对其进行迭代或使用数字索引。查询返回命名元组对象。如果你想要一个字典,用它的键压缩元组:

 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

原文由 Ants Aasma 发布,翻译遵循 CC BY-SA 2.5 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏