2016-08-23 9 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を使用して、私のメモリ使用量は期待どおりにゼロになります。私は何が欠けていますか?これを達成する他の方法はありますか? docsから

答えて

0

stream_results - 上の利用可能:接続、ステートメント。 が可能ならば、結果は "ストリーミング"され、プリバッファリングされてはならないことを 方言に示します。これは多くのDBAPIの制限です。 フラグは現在 であり、psycopg2方言によってのみ理解されています。

私は同じように、あなただけの複数のセッションをストリーミング用と通常のクエリのための1つを作成したい考える

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

関連する問題