gpt4 book ai didi

python - 如何重用/克隆 sqlalchemy 查询

转载 作者:太空狗 更新时间:2023-10-30 01:40:45 27 4
gpt4 key购买 nike

在我看来,在使用 sqlalchemy 时,经历创建表达式树然后再次从中创建查询的整个过程是浪费时间。除了偶尔的动态查询之外,几乎所有内容在应用程序的整个生命周期中都将完全相同(当然除了参数)。

有没有什么方法可以在创建查询后保存它并在以后使用不同的参数重用它?或者也许有一些内部机制已经做了类似的事情?

最佳答案

It seems to me like going through the whole process of creating the expression tree and then creating a query from it again is a wasted time when using sqlalchemy.

与应用程序的其余部分相比,您是否估计浪费了多少时间?在使您的程序更复杂之前,此处的分析非常重要。正如我经常注意到的那样,Reddit 每天提供超过 10 亿的页面浏览量,他们使用 SQLAlchemy Core 查询他们的数据库,上次我查看他们的代码时他们没有尝试优化这个过程 - 他们构建表达式树每次飞行和编译。然而,我们已经有用户确定他们的特定系统实际上受益于这些领域的优化。

我在这里写了一些关于分析的背景:How can I profile a SQLAlchemy powered application?

Is there any way to just save a query once it's created and reuse it later on with different parameters? Or maybe there's some internal mechanism which already does something similar?

有多种方法,具体取决于您使用的 API 以及您希望优化的领域。

呈现 SQL 有两个主要部分 - 可以说是表达式树的构造,然后是从表达式树编译字符串。

树本身可以重用,如果使用 Core,它可以是一个 select() 结构;如果使用 ORM,它可以是一个 Query() 结构。尤其是 select() 与它没有任何关联,可以防止它被随意重复使用(insert()、delete()、update() 等也是如此)。

在 ORM 中,查询也可以使用 with_session() 用于不同的 session 。方法。这里的优势并不大,因为每次调用 Query() 时仍会生成整个 select()。然而,正如我们将在下面看到的那样,有一个方法可以允许对其进行缓存。

下一级优化涉及缓存呈现的实际 SQL 文本。这是一个需要多加注意的领域,因为我们生成的 SQL 特定于目标后端;还有一些边缘情况,其中各种参数化会更改 SQL 本身(例如在 SQL Server 中使用“TOP N ROWS”,我们不能在那里使用绑定(bind)参数)。使用 execution_options() 提供 SQL 字符串的缓存Connection 的方法,它在其他一些地方也可用,通过向它发送字典或其他类似字典的对象来设置 compiled_cache 功能,它将缓存字符串格式语句,键入方言,构造的身份和发送的参数。 ORM 通常将此功能用于插入/更新/删除语句。

我在BakedQuery 发布了一个将compiled_cache 功能与Query 集成在一起的方法。 .通过获取任何 Query 并说出 query.bake(),您现在可以使用任何 Session 运行该查询,只要您不这样做在其上调用任何更多的链接方法,它应该每次都使用 SQL 字符串的缓存形式:

q = s.query(Foo).filter(Foo.data==bindparam('foo')).bake()

for i in range(10):
result = q.from_session(s).params(foo='data 12').all()

它是实验性的,并不经常使用,但这正是您在这里所要求的。我建议您根据自己的需要定制它,在使用时留意内存使用情况并确保遵循它的工作原理。

关于python - 如何重用/克隆 sqlalchemy 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16543573/

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