如何从内存中删除SQLAlchemy实体的延迟属性?

Vic*_*rin 7 python memory sqlalchemy deferred

例如,我们有一个存储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))
Run Code Online (Sandbox Code Playgroud)

LONGBLOB标记为延迟的列,即仅在访问特定对象的此属性时加载.

我需要从数据库中查询对象列表并迭代集合:

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

在这个循环中,所有BLOB都将从数据库加载,内存将耗尽.我需要一种方法来清理每个周期结束时的内存.从会话中删除对象并从内存中删除完全不方便...

如何清理object(LONGBLOB)的特定属性但不从会话中删除对象?

Raz*_*erM 1

不要加载bigData到对象中。延迟加载已经在每次迭代中执行一次查询,因此您可以自己执行此操作,而无需将其与 MyEntity 实例关联:

entities = dbSession.query(MyEntity).all()
for entity in entities:
    bigData = session.query(MyEntity.bigData).filter_by(id=entity.id).scalar()
Run Code Online (Sandbox Code Playgroud)

bigData只要不保留任何对它的引用,就应该清理掉。