我在一个库中工作,需要读取与另一个类具有一对多关系的多个对象。以下代码表示我的库代码的高度简化版本:
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查询的情况下卸载对象并增加执行时间?
答案 0 :(得分:0)
默认情况下,您的对象仅存储在使用弱引用的Session
中,这意味着您只需删除自己对对象的引用即可从内存中清除它们。
也就是说,您可以随时致电Session.expunge_all()
删除会话中仍然存在的任何内容。如果您需要提交更改,请不要调用此方法,首先发出Session.flush()
。
您也可以使用Session.expunge()
method删除单个Point
个对象。
有关详细信息,请参阅Using the Session。