簡體   English   中英

SQLAlchemy返回元組而不是字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM