2011-11-24 39 views
34

Vì nhiều lý do, tôi đang cố gắng lấy một bộ sưu tập các đối tượng ra khỏi cơ sở dữ liệu và chuyển nó sang một tiến trình khác không được kết nối với cơ sở dữ liệu. Mã của tôi trông giống như bên dưới nhưng tôi tiếp tục nhận đượcSQLAlchemy, lấy đối tượng không bị ràng buộc vào một phiên

sqlalchemy.exc.UnboundExecutionError: Instance <MyClass at 0x8db7fec> is not bound to a Session; attribute refresh operation cannot proceed 

Khi tôi cố gắng xem xét các yếu tố trong danh sách của tôi bên ngoài phương pháp get_list().

def get_list (obj): 
    sesson = Session() 
    lst = session.query(MyClass).all() 
    session.close() 
    return lst 

Tuy nhiên, nếu tôi sử dụng này

def get_list_bis (obj) 
    session = Session() 
    return session.query(MyClass).all() 

tôi có thể sử dụng các yếu tố nhưng lo lắng về tình trạng của phiên giao dịch kể từ khi nó không được đóng lại.

Tôi thiếu gì ở đây?

Trả lời

39

Nếu bạn muốn một loạt các đối tượng được tạo ra bằng cách truy vấn phiên có thể sử dụng ngoài phạm vi phiên, bạn cần phải expunge chúng cho phiên.

Trong ví dụ chức năng đầu tiên của bạn, bạn sẽ cần phải thêm một dòng:

session.expunge_all() 

trước

session.close() 

Tổng quát hơn, chúng ta hãy nói phiên không được đóng lại ngay lập tức, như trong lần đầu tiên thí dụ. Có lẽ đây là một phiên được duy trì hoạt động trong toàn bộ thời gian của một yêu cầu web hoặc một cái gì đó như thế. Trong những trường hợp như vậy, bạn không muốn làm expunge_all. Bạn sẽ muốn được phẫu thuật hơn:

for item in lst: 
    session.expunge(item) 
+17

Nhưng ... nhưng ... "Phương thức close() đưa ra expunge_all() và giải phóng mọi tài nguyên giao dịch/kết nối." Tuyên bố này nằm trên trang bạn đã tham chiếu, quay lại ít nhất là phiên bản 0.6. – Oddthinking

1

Trong trường hợp của tôi, tôi đã tiết kiệm một thực thể có liên quan là tốt, và công thức này đã giúp tôi refresh tất cả các trường trong một phiên, tận dụng thực tế là phiên là iterable:

map(session.refresh, iter(session)) # call refresh() on every instance 

Điều này vô cùng hiệu quả nhưng hoạt động. Nên tốt cho các bài kiểm tra đơn vị.

Lưu ý cuối cùng: trong Python3 map() là trình tạo và không hoạt động. Sử dụng vòng lặp danh sách thực sự

+4

Trong mọi trường hợp, bạn không nên sử dụng 'bản đồ' nếu bạn không quan tâm đến kết quả. – ThiefMaster

Các vấn đề liên quan