【问题标题】:How to remove deferred attribute of SQLAlchemy entity from memory?如何从内存中删除 SQLAlchemy 实体的延迟属性?
【发布时间】:2016-10-18 21:56:46
【问题描述】:

例如我们有一个存储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) 但不从会话中删除对象?

【问题讨论】:

  • 你试过entity.bigData = None

标签: python memory sqlalchemy deferred


【解决方案1】:

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

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

bigData 应该被清理,只要周围没有对它的引用。

【讨论】:

  • 我不会奖励这个答案 - 这是一个非常明显的解决方法,如果他们没有找到答案,我认为任何提出这个问题的人都不会回过头来。我希望得到一个更明智的答案,例如“不可能,因为...”、“您需要更改模型的私有状态...”或“这是一个您找不到的实用函数...”
  • @BartoszMarcinkowski 很好,但我认为您想要回答的问题不是这个。该问题要求一种清理已加载列的方法。它承认删除整个对象并不是一个理想的解决方案。它没有说“我知道我可以单独加载列,但是有没有办法从对象中卸载列?”。它被延迟的事实是无关紧要的,因为任何列都可以在加载时被延迟。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2015-12-13
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多