gpt4 book ai didi

python - SQLAlchemy 能否仅将 MySQL 的 SSCursor 用于某些查询?

转载 作者:行者123 更新时间:2023-11-29 02:48:19 24 4
gpt4 key购买 nike

我有一个从我的 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,我的内存使用量下降到零正如预期的那样。我错过了什么?有没有其他方法可以做到这一点?

最佳答案

来自docs :

stream_results – Available on: Connection, statement. Indicate to the dialect that results should be “streamed” and not pre-buffered, if possible. This is a limitation of many DBAPIs. The flag is currently understood only by the psycopg2 dialect.

认为您只想创建多个 session ,一个用于流媒体,一个用于普通查询,例如:

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

关于python - SQLAlchemy 能否仅将 MySQL 的 SSCursor 用于某些查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com