加载后可以卸载sqlalchemy对象的关系数据吗?

时间:2013-03-26 14:46:08

标签: python sqlalchemy

我在一个库中工作,需要读取与另一个类具有一对多关系的多个对象。以下代码表示我的库代码的高度简化版本:

class Plan(Base):
  __tablename__ = 'plan'
  id = Column(Integer, primary_key=True)
  name = Column(String)

  points = relationship('Point')

  def __init__(self,name):
    self.name = name


class Point(Base):
    __tablename__ = 'point'

    id          = Column(Integer, primary_key=True)
    coordinates = Column(String)
    plan_id     = Column(Integer,ForeignKey('plan.id'))

    def __init__(self, coordinates):
    self.coordinates = coordinates

我需要读取关系的所有数据(上面示例的所有点),对所有点进行操作,然后继续下一个对象(示例中来自Plan类的对象)。由于每个计划所拥有的点数很多,我无法将所有数据加载到内存中,我想做的是在完成与计划相关的点对象(我不需要它们之后)的操作之后操作),卸载它们并继续下一个计划的过程。我尝试了以下方法:

plan.points = []

for point in plan.points:
  plan.points.remove(point)

但是这些方法中的每一种都会堆叠更新或删除查询(取决于如何在关系中设置级联属性),这意味着流程的开销很大,将总执行时间增加2或3并堆叠可能有害的如果会话已提交,则为SQL操作。

有没有办法在不生成这些UPDATE / DELETE查询的情况下卸载对象并增加执行时间?

1 个答案:

答案 0 :(得分:0)

默认情况下,您的对象仅存储在使用弱引用Session中,这意味着您只需删除自己对对象的引用即可从内存中清除它们。

也就是说,您可以随时致电Session.expunge_all()删除会话中仍然存在的任何内容。如果您需要提交更改,请不要调用此方法,首先发出Session.flush()

您也可以使用Session.expunge() method删除单个Point个对象。

有关详细信息,请参阅Using the Session