[英]SQLAlchemy returns tuple not dictionary
我已經將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中的字典。
我的問題是如何歸還字典?
session.execute從未返回過dict,它返回一個RowProxy對象,可以像 dict一樣使用整數鍵進行位置查找,使用基於標簽的查找字符串鍵或使用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()
方法或迭代它或使用數字索引。 查詢返回名為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
你確定它不是一個在打印時假裝成元組的ResultProxy嗎? ORM中的許多對象不是它們的__str__
函數返回的對象。
這應該工作: dict(zip(['id','username','email'],result))
(或者你可以使用字典理解,如果你在Python 3.x上)。
此外,您不需要在session.query
對象上調用session.execute
。 你會想要在它上面使用.one()
方法。 這也消除了在查詢結束時掛起的.limit(1)
調用的需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.