2016-10-18 15 views
7

Ví dụ chúng ta có một bảng mà các cửa hàng LONGBLOB đối tượng:Làm thế nào để loại bỏ thuộc tính hoãn lại của thực thể SQLAlchemy khỏi bộ nhớ?

class MyEntity(_base): 
    id = Column('ID', Integer, primary_key=True) 
    metadata = Column('META', String(512), nullable=False) 
    bigData = deferred(Column('BIG_DATA', LONGBLOB, nullable=False)) 

Cột với LONGBLOB đánh dấu là chậm, tức là nó được nạp chỉ về tiếp cận thuộc tính này của đối tượng cụ thể.

tôi cần phải truy vấn danh sách các đối tượng từ cơ sở dữ liệu và duyệt qua bộ sưu tập:

entities = dbSession.query(MyEntity).all() 
for entity in entities: 
    ... 
    entity.bigData # load BLOB from the database and do smth with data 
    ... 

Trong vòng này tất cả các đốm màu sẽ được nạp từ cơ sở dữ liệu và bộ nhớ sẽ bị cạn kiệt. Tôi cần một cách để làm sạch bộ nhớ vào cuối mỗi chu kỳ. Xóa đối tượng khỏi phiên và xóa khỏi bộ nhớ hoàn toàn không tiện dụng ...

Làm cách nào để xóa thuộc tính cụ thể của đối tượng (LONGBLOB) nhưng không loại bỏ đối tượng khỏi phiên?

+0

Bạn đã thử 'entity.bigData = None' – stovfl

Trả lời

1

Không tải bigData vào đối tượng. Tải chậm đã được thực hiện một truy vấn mỗi lần lặp, do đó bạn có thể làm điều đó cho mình mà không cần kết hợp nó với các trường hợp MyEntity:

entities = dbSession.query(MyEntity).all() 
for entity in entities: 
    bigData = session.query(MyEntity.bigData).filter_by(id=entity.id).scalar() 

bigData nên được làm sạch lên miễn là không có tài liệu tham khảo để nó được giữ lại.

+0

Tôi sẽ không trao giải thưởng này tiền thưởng - đây là một giải pháp khá rõ ràng và tôi không nghĩ rằng bất cứ ai hỏi câu hỏi này sẽ không quay trở lại điều này nếu họ có không tìm thấy câu trả lời. Tôi mong đợi một câu trả lời thông tin tốt hơn như "không thể vì ...", "bạn cần thay đổi trạng thái riêng tư của mô hình như ..." hoặc "đây là chức năng tiện ích mà bạn không thể tìm thấy ..." –

+0

@BartoszMarcinkowski Tốt thôi, nhưng tôi nghĩ câu hỏi mà bạn muốn câu trả lời không phải là câu trả lời này. Câu hỏi được hỏi về cách dọn dẹp một cột đã tải. Nó thừa nhận rằng việc xóa bỏ toàn bộ vật thể không phải là một giải pháp lý tưởng. Nó không nói "Tôi biết tôi có thể tải cột một cách riêng biệt, nhưng có cách nào để dỡ bỏ một cột từ một đối tượng thay thế?". Thực tế là nó được hoãn lại là bên cạnh điểm, vì bất kỳ cột nào có thể được trì hoãn tại thời điểm tải. – RazerM

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