빈 콜렉션을 테스트하기 위해 페이징 된 쿼리를 수행하는 메모리 효율적인 방법을 찾고 있지만 대형 데이터베이스에서 효율적으로 수행하는 방법을 파악할 수 없습니다. 테이블 레이아웃은 양방향 백 디렉토리와 연관 개체를 사용합니다. documentation과 매우 유사합니다.SQLAlchemy에서 빈 컬렉션으로 페이지 된 쿼리를 수행하는 방법은 무엇입니까?
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)
회원이 삭제되면 회원 연계가 계단식으로 삭제됩니다. 그러나 청크 개체는 데이터베이스에서 고아가됩니다. 협회 및 청크 테이블이 큰 경우,
query.delete(synchronize_session=False)
그러나 다음과 함께 덩어리를 삭제 한 후
session.query(Chunk).filter(~Chunk.assoc.any())
과 : 고아 청크를 삭제하려면,이 같은 쿼리를 사용하여 빈 콜렉션을 테스트 할 수 있습니다 그것은 쿼리 또는 하위 쿼리가 모든 것을로드하고 메모리가 급증한 것처럼 보입니다. 그러나이 메모리 사용량이 그대로 빈 쿼리 모음 작업을 나타나지 않습니다
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
:
나는 표준 쿼리 here의 메모리 사용을 제한하는 페이징 쿼리를 사용의 개념을 보았다 여전히 높습니다. 이 같은 빈 컬렉션에 대한 페이징 된 쿼리를 수행 할 수있는 방법이 있습니까?