2016-08-23 2 views
1

모든 데이터를 메모리에로드하는 것이 옵션이 아닌 MySQL 데이터베이스에서 많은 데이터를 가져 오는 쿼리가 있습니다. 다행히 SQLAlchemy를 사용하면 MySQL의 SSCursor를 사용하여 엔진을 만들 수 있으므로 데이터가 스트리밍되고 메모리에 완전히로드되지 않습니다. 위대한일부 쿼리에 대해서만 SQLAlchemy에서 MySQL의 SSCursor를 사용할 수 있습니까?

create_engine(connect_str, connect_args={'cursorclass': MySQLdb.cursors.SSCursor}) 

을,하지만 난 아주 작은 사람을 포함한 모든 내 쿼리 SSCursor을 사용하지 않습니다 그래서 같이이 작업을 수행 할 수 있습니다. 차라리 정말로 필요한 곳에서만 사용하고 싶습니다. 내가 이렇게 같은 stream_results 설정이 작업을 수행 할 수있을 거라고 생각 : 그 사용시 메모리 사용량을 모니터링 할 때 불행하게도

conn.execution_options(stream_results=True).execute(MyTable.__table__.select()) 

,, 내가하지 않는 것처럼 메모리의 동일한 금액을 사용하는 것 그, SSCursor 사용하는 동안 내 메모리 사용량이 예상대로 nil로 이동합니다. 내가 뭘 놓치고 있니? 이것을 이루기위한 다른 방법이 있습니까? docs에서

답변

0

:

stream_results -에서 사용 가능 : 연결, 문. 방언에 결과가 "스트리밍"되어야하며 미리 버퍼링되지 않아야한다고 표기하십시오 ( ). 이것은 많은 DBAPI의 제한 사항입니다. 깃발은 현재 이며 psycopg2 방언으로 만 이해됩니다.

나는 방금 ​​여러 세션에게 같은 일반적인 쿼리에 대한 스트리밍을위한 하나 하나를 만들 생각 :

from sqlalchemy.orm import sessionmaker 
from sqlalchemy import create_engine 

def create_session(engine): 
    # configure Session class with desired options 
    Session = sessionmaker() 

    # associate it with our custom Session class 
    Session.configure(bind=engine) 

    # work with the session 
    session = Session() 

    return session 


#streaming 
stream_engine = create_engine(connect_str, connect_args={'cursorclass': MySQLdb.cursors.SSCursor}) 
stream_session = create_session(stream_engine) 

stream_session.execute(MyTable.__table__.select()) 

#normal 
normal_engine = create_engine(connect_str) 
normal_session = create_session(normal_engine) 

normal_session.execute(MyTable.__table__.select()) 
+1

이 내가 질문을하기 전에 함께가는 상처 무슨 본질적이다. 단지 여분의 연결을 열어 과도하게 관리해야한다는 것을 의미합니다. 누군가가 더 좋은 방법을 가지고 있는지보기 위해 좀 더 오래 기다릴 것이고 그렇지 않다면 이것을 옳은 것으로 표시 할 것입니다. – Eli

관련 문제