我有一个从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。我错过了什么?还有其他方法可以实现这个目标吗?
答案 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())