我正在尝试找到一种内存有效的方法来执行分页查询以测试空集合,但似乎无法弄清楚如何在大型数据库上有效地执行它。表格布局使用具有双向反向引用的关联对象。它与文档非常相似。
class Association(Base):
__tablename__ = 'Association'
assoc_id = Column(Integer, primary_key=True, nullable=False, unique=True)
member_id = Column(Integer, ForeignKey('Member.id'))
chunk_id = Column(Integer, ForeignKey('Chunk.id'))
extra = Column(Text)
chunk = relationship("Chunk", backref=backref("assoc", lazy="dynamic"))
class Member(Base):
__tablename__ = 'Member'
id = Column(Integer, primary_key=True, nullable=False, unique=True)
assocs = relationship("Association", backref="member", cascade="all, delete", lazy="dynamic")
class Chunk(Base):
__tablename__ = 'Chunk'
id = Column(Integer, primary_key=True, nullable=False, unique=True)
name = Column(Text, unique=True)
如果成员被删除,则会级联删除成员的关联。但是,块对象将在数据库中成为孤立对象。要删除孤立的块,我可以使用如下查询测试空集合:
session.query(Chunk).filter(~Chunk.assoc.any())
然后使用以下命令删除块:
query.delete(synchronize_session=False)
但是,如果关联表和块表很大,则查询或子查询似乎会加载所有内容并且内存猛增。
我在这里看到了使用分页查询来限制标准查询的内存使用的概念:
def page_query(q, count=1000):
offset = 0
while True:
r = False
for elem in q.limit(count).offset(offset):
r = True
yield elem
offset += count
if not r:
break
for chunk in page_query(Session.query(Chunk)):
print chunk.name
但是,这似乎不适用于空集合查询,因为内存使用率仍然很高。有没有办法对这样的空集合进行分页查询?