SQLAlchemy可以仅使用MySQL的SSCursor进行一些查询吗?

时间:2016-08-23 21:20:31

标签: python mysql sqlalchemy

我有一个从MySQL数据库中获取大量数据的查询,其中不能将所有数据加载到内存中。幸运的是,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。我错过了什么?还有其他方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

来自docs

  

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())