例如,我们有一个存储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,并且将耗尽内存。我需要一种在每个周期结束时清除内存的方法。从 session 中删除对象并将其完全从内存中删除并不方便...

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

最佳答案

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

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

只要不保留对bigData的引用,就应该清除它。

关于python - 如何从内存中删除SQLAlchemy实体的延迟属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40118771/

10-10 14:48