데이터베이스 (단일 테이블)의 결과를 쿼리하는 작은 프로그램을 작성하고 있습니다. 파이썬 3.3, sqlalchemy 및 postgres 데이터베이스를 사용하고 있습니다.하나씩 데이터베이스에서 결과 가져 오기
result = db_session.query(Data).all()
progress = 0
for row in result:
update_progress_bar(progress, len(result))
do_something_with_data(row)
progress += 1
변수 '결과'에는 수천 개의 행이 포함되며 데이터 처리에는 다소 시간이 걸립니다. 그래서 간단한 진도 표시 줄을 도입하여 병사가 어떻게 걸릴지 생각해보십시오. 문제는 전체 시간의 30 %가 데이터베이스를 큐잉한다는 것입니다 (첫 번째 줄). 그래서 프로그램을 시작할 때 진행 막대가 움직이기 전에 나는 커다란 지체를 갖습니다. 또한 모든 결과를 기억할 필요가 없습니다. 별도로 처리 할 수 있습니다.
모든 프로그램을 메모리에로드하지 않고 모든 행을 수신 할 때까지 하나씩 행을 얻으려면 위의 프로그램을 수정할 방법이 있습니까? 또한 데이터 쿼리 및 처리 진행 상황을 모니터링하고 싶습니다. ,
for row in db_session.query(Data).yield_per(10):
do_something_with_data(row)
.all()
참으로 목록 첫로 설정 한 전체 결과를집니다 :
EOL sugestion 덕분에 '스트리밍 결과'를 살펴볼 수 있습니다. 작동 시키려면 ".execution_options (stream_results = True)"를 사용하여 쿼리를 실행해야합니다. 나는 또한 내 데이터베이스 어댑터 (pypostgresql) 스트리밍을 지원하지 않는 것을 알게됩니다. 그 일을 할 수있는 유일한 사람은 psycop2입니다. 운 좋게도, 새로운 psycop2 2.5는 이제 python 3.3을 지원합니다. :) 경험을 공유하고 테스트 해 보겠습니다. – Marek