2013-03-26 36 views
0

我在一個庫中工作,需要讀取與另一個類具有一對多關係的多個對象。以下代碼表示我的庫的代碼的高度簡化版本:是否可以卸載一次加載的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查詢的情況下卸載對象並增加執行時間?

回答

0

默認情況下,您的對象僅存儲在Session使用弱引用,這意味着您可以簡單地刪除自己對對象的引用以從內存中清除它們。

也就是說,你可以自由地撥打Session.expunge_all()刪除會議中仍然持有的任何東西。如果您有需要提交的更改,請不要致電此問題,請先發出Session.flush()

您也可以使用Session.expunge() method刪除個人Point對象。

請參閱Using the Session瞭解更多詳情。

+0

謝謝,我已經嘗試過(先刪除相關對象,然後plan.points = []),它的工作原理雖然我得到一個警告提到刪除操作將不會繼續,所以我不知道這是否是進行此操作的最佳方法。 – muesan 2013-04-02 13:52:18

相關問題