session.execute chưa bao giờ trở lại một dict, nó sẽ trả về một đối tượng RowProxy, mà có thể được lập chỉ mục như một dict bằng cách sử dụng các phím số nguyên cho tra cứu vị trí, phím chuỗi cho nhãn dựa tra cứu lên hoặc cột đối tượng để tra cứu giá trị của cột đó. Vấn đề ở đây là session.execute(query)
không làm những gì bạn có vẻ mong đợi. Nó chuyển đổi đối tượng Query thành câu lệnh Select, thực hiện điều đó và trả về kết quả trực tiếp. Kết quả không biết gì về các tính năng mức ORM. Điều gì đã thay đổi giữa 0,5 quảng cáo 0.6 là ORM sử dụng một thuật toán khác nhau để gắn nhãn các cột trong truy vấn, bây giờ nó sẽ thêm tên bảng vào nhãn. Vì vậy, khi trước đây row['id']
đã xảy ra để hoạt động, hiện tại row['users_id']
hoạt động. Trong cả hai trường hợp, row[User.__table__.columns['id']]
đều hoạt động.
Để thực hiện truy vấn ORM, bạn thực sự nên sử dụng các phương pháp .all()
, .first()
và .one()
hoặc lặp lại qua hoặc sử dụng lập chỉ mục bằng số. Truy vấn trả về các đối tượng có tên tuple. Hãy nén tuple bằng các khóa của nó nếu bạn muốn một dict:
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
Nguồn
2010-05-17 11:17:06
Chỉ cần tò mò: Tại sao bạn không làm 'session.query (Người dùng) .get (id)' (giả sử User.id là khóa chính) . Hoặc 'session.query (User) .filter (User.id == id) .filter (User.username == tên người dùng) .first()' nếu id không phải là khóa chính. Làm điều đó, và bạn sẽ lấy lại một cá thể User, và bạn có thể truy cập các giá trị trường bằng tra cứu thuộc tính. – codeape