gpt4 book ai didi

python - postgres/sqlalchemy/python : converting sqlalchemy. sql.selectable.Select 到 sqlalchemy.orm.query.Query?

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:27 31 4
gpt4 key购买 nike

我正在开发一个现有应用程序,该应用程序通过创建 sqlalchemy.sql.selectable.Select 对象并运行其 execute() 方法来运行 SQL postgres 查询。

我正在尝试减少这些查询的客户端内存使用,因此我想使用 sqlalchemy.orm.query.Query 对象将其转换为基于 session 的方法据此,我可以使用 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

关于python - postgres/sqlalchemy/python : converting sqlalchemy. sql.selectable.Select 到 sqlalchemy.orm.query.Query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46648950/

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