【问题标题】:Iterating over a SQLAlchemy Collection Efficiently有效地迭代 SQLAlchemy 集合
【发布时间】:2012-05-25 23:00:45
【问题描述】:

我有一个 SQLAlchemy ORM 模型,用于将特定行(完整对象图)从我们的生产数据库传输到我们的测试和开发数据库。这工作得很好,直到我得到一个包含很多子依赖项的集合,然后我遇到了MemoryError。我已经在对象层次结构的关键点设置了动态加载,并使用不同的查询分别加载子项,但仍有一些集合有足够的子数据,我遇到了内存问题。

一次只加载一个集合的一个元素的最佳方法是什么,这样我就可以一次复制单个对象(及其所有子行)?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    尝试在使用Session.expunge 处理每个节点(带有子节点)后清理会话。下面的示例代码打印会话中的实例数:

    class Node(Base):
        __tablename__ = 'node'
        id = Column(Integer, primary_key=True)
        parent_id = Column(Integer, ForeignKey('node.id'))
        name = Column(String(50))
        children = relationship("Node",
                backref=backref("parent", remote_side=[id],)
                )
    
    def process_node(node, expunge=False, ident=1):
        print "Node: ", "-" * ident, node, " --> ", len(session.identity_map)
        for child in node.children:
            process_node(child, expunge, ident + 4)
            session.expunge(child)
    
    roots = session.query(Node).filter(Node.parent == None)
    for root in roots:
        process_node(root, True)
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2014-01-19
      • 2012-09-07
      相关资源
      最近更新 更多