postgres/sqlalchemy/python:转换sqlalchemy.sql.exe。选择要sqlalchemy.orm.query查询.查询?

2024-06-17 08:20:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个现有的应用程序,它通过创建sqlalchemy.sql.selectable.Select对象并运行它们的execute()方法来运行sqlpostgres查询。你知道吗

我正在尝试减少这些查询的客户端内存使用,因此我想将其转换为基于会话的方法,使用sqlalchemy.orm.query.Query对象,我可以使用yield_per()方法来减少从服务器发送到客户端的数据量。你知道吗

为了做到这一点,我想以某种方式将sqlalchemy.sql.selectable.Select对象直接转换成sqlalchemy.orm.query.Query对象,这样我就不必重写代码中当前存在的所有查询。你知道吗

我找不到任何方法来执行这个转换。sqlalchemy中是否存在这样的转换功能,如果存在,在哪里可以找到它的文档?你知道吗

非常感谢。你知道吗


Tags: 对象方法内存应用程序客户端executesqlsqlalchemy
1条回答
网友
1楼 · 发布于 2024-06-17 08:20:09

您可以排序将语句转换成Query对象,如下所示:

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

但是这样做是错误的,因为你没有使用任何ORM特性就进入了ORM的一层。更正确的做法是在核心层解决这个问题。正确的方法是使用^{}

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

相关问题 更多 >