有效地迭代SQLAlchemy集合

时间:2012-05-24 20:55:50

标签: python sqlalchemy

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

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

1 个答案:

答案 0 :(得分: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)
相关问题