高效地迭代 SQLAlchemy 集合

3
我有一个SQLAlchemy ORM模型,用于将我们生产数据库中的特定行(完整对象图)转移到测试和开发数据库。这很有效,直到我遇到一个具有许多子依赖项的集合,并遇到了MemoryError。我已经在对象层次结构的关键点设置了动态加载,并使用不同的查询单独加载子级,但仍然有一些集合具有足够的子数据,导致我的内存出现问题。
最好的方法是只一次加载集合中的一个元素,以便逐个复制对象(及其所有子行)。
1个回答

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接