[英]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.