Phiên được thiết kế để hoạt động như thế này . Các thuộc tính của đối tượng trong Phiên B SẼ giữ nguyên những gì nó có khi được truy vấn lần đầu tiên trong Phiên B. Ngoài ra, SQLAlchemy sẽ không cố gắng tự động làm mới các đối tượng trong các phiên khác khi chúng thay đổi, tôi cũng không nghĩ sẽ là khôn ngoan khi cố gắng tạo một thứ gì đó như thế này.
Bạn nên chủ động nghĩ về thời gian tồn tại của mỗi phiên như một giao dịch duy nhất trong cơ sở dữ liệu. Cách thức và thời điểm các phiên cần giải quyết thực tế là các đối tượng của chúng có thể đã cũ không phải là một vấn đề kỹ thuật có thể được giải quyết bằng một thuật toán được tích hợp trong SQLAlchemy (hoặc bất kỳ phần mở rộng nào cho SQLAlchemy):đó là một vấn đề "kinh doanh" mà bạn phải có giải pháp xác định và mã cho mình. Phản hồi "đúng" có thể nói rằng đây không phải là vấn đề:logic xảy ra với Phiên B có thể hợp lệ nếu nó sử dụng dữ liệu tại thời điểm Phiên B bắt đầu. "Vấn đề" của bạn có thể không thực sự là một vấn đề. Tài liệu thực sự có toàn bộ phần về thời điểm sử dụng phiên , nhưng nó đưa ra một phản ứng khá tồi tệ nếu bạn đang hy vọng vào một giải pháp phù hợp với tất cả ...
Điều đó nói rằng, có một số điều bạn có thể làm để thay đổi cách tình hình hoạt động:
Đầu tiên, bạn có thể giảm thời lượng phiên của bạn vẫn mở. Phiên B đang truy vấn đối tượng, sau đó bạn đang làm gì đó với đối tượng đó (trong cùng một phiên) mà bạn muốn cập nhật các thuộc tính. Một giải pháp là thực hiện thao tác thứ hai này trong một phiên riêng biệt.
Cách khác là sử dụng các phương thức hết hạn / làm mới, như tài liệu hiển thị ...
# immediately re-load attributes on obj1, obj2
session.refresh(obj1)
session.refresh(obj2)
# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(obj1)
session.expire(obj2)
Bạn có thể sử dụng session.refresh()
để nhận ngay phiên bản cập nhật của đối tượng, ngay cả khi phiên đã truy vấn đối tượng trước đó.