繁体   English   中英

postgres/sqlalchemy/python:将 sqlalchemy.sql.selectable.Select 转换为 sqlalchemy.orm.query.Query?

[英]postgres/sqlalchemy/python: converting sqlalchemy.sql.selectable.Select to sqlalchemy.orm.query.Query?

我正在通过创建sqlalchemy.sql.selectable.Select对象并运行它们的execute()方法来处理运行 SQL postgres 查询的现有应用程序。

我想,以减少客户端的内存使用这些查询的,所以我想将其转换为使用基于会话的方法sqlalchemy.orm.query.Query对象时,我可以使用yield_per()方法减少从服务器发送到客户端的数据量。

为此,我想以某种方式将sqlalchemy.sql.selectable.Select对象直接转换为sqlalchemy.orm.query.Query对象,这样我就不必重写各种现有的查询它们当前存在的代码中的位置。

我一直无法找到任何方法来执行此转换。 sqlalchemy 中是否甚至存在这种转换功能,如果存在,我在哪里可以找到它的文档?

非常感谢。

您可以像这样将语句转换为Query对象:

stmt = select([foo.c.id, foo.c.bar])
query = session.query(*stmt.inner_columns).from_statement(stmt)

但这是错误的方法,因为您在不使用任何 ORM 功能的情况下将一层添加到 ORM 中。 在核心层弄清楚如何做到这一点更正确。 正确的方法是使用stream_results

conn = engine.connect().execution_options(stream_results=True)
for row in conn.execute(stmt):
    ...

这使用BufferedRowResultProxy来缓冲结果,它具有连续获取上限为 1000 的更大批次的逻辑。如果您需要更改此行为,您需要下拉到 DBAPI 层:

conn = engine.connect()
with conn.connection.connection.cursor(name="foo") as cur:
    cur.itersize = 10000
    compiled = stmt.compile(engine)
    cur.execute(compiled.string, compiled.params)
    for row in cur:
        pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM