例如,我们有一个存储LONGBLOB
个对象的表:
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))
LONGBLOB
标记为延迟的列,即仅在访问特定对象的此属性时加载。
我需要从数据库中查询对象列表并迭代集合:
entities = dbSession.query(MyEntity).all()
for entity in entities:
...
entity.bigData # load BLOB from the database and do smth with data
...
在此循环中,所有BLOB都将从数据库加载,内存将耗尽。我需要一种方法来清理每个周期结束时的内存。从会话中删除对象并从内存中删除完全不方便......
如何清理对象的特定属性(LONGBLOB
)但不从会话中删除对象?
答案 0 :(得分:1)
不要将bigData
加载到对象中。延迟加载已经在每次迭代时进行查询,因此您可以自己完成,而无需将其与MyEntity实例关联:
entities = dbSession.query(MyEntity).all()
for entity in entities:
bigData = session.query(MyEntity.bigData).filter_by(id=entity.id).scalar()
只要不保留对它的引用,就应该清理 bigData
。