1

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

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 查询和增加执行时间的情况下卸载对象?

4

1 回答 1

0

默认情况下,您的对象仅存储在Sessionusing weak references中,这意味着您可以简单地删除自己对对象的引用以从内存中清除它们。

也就是说,您可以随意调用Session.expunge_all()以删除会话中仍保留的任何内容。如果您有需要提交的更改,请不要调用它,请先发出Session.flush()

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

有关更多详细信息,请参阅使用会话

于 2013-03-26T14:52:50.153 回答