Python对象查询语言

17 投票
7 回答
10300 浏览
提问于 2025-04-16 12:35

我在找一个库,可以让我在Python的“对象数据库”上运行类似SQL的查询。这里的对象数据库指的是在内存中比较复杂的Python对象和列表的结构。简单来说,这就像是一个“反向ORM”——它不是给关系数据库提供面向对象的接口,而是给对象数据库提供类似SQL的接口。

C#的LINQ很接近这个想法。Python的列表推导式也很好用,但当要做复杂操作(比如排序、连接等)时,语法就变得有点复杂了。而且,我不能(很容易地)用列表推导式动态创建查询。

实际的语法可以是基于字符串的,或者使用面向对象的领域特定语言(比如像这样:from(mylist).select(...))。如果这个库还能提供某种索引来加速搜索,那就更好了。

这种东西存在吗,还是我得自己发明一个?

7 个回答

2

如果你喜欢列表推导式,别忘了它们的“懒惰”版本:生成器表达式。这些东西在某种程度上可以帮助你动态构建查询。再加上itertools库,以及一些可以处理可迭代对象的内置函数,你可以说你拥有了类似于Python的“LINQ to Object”(或者至少是非常接近的东西)。

在Python中,你不会像在C#和LINQ中那样得到“伪SQL”语法,但这可能只是个人喜好问题。(就我个人而言,我喜欢它保持Python的风格,使用相同的关键字等,而不是试图变成SQL:使用熟悉的iffor语句,而不是引入wherefrom等等)。

面向对象的DSL(领域特定语言)方法似乎是可行的(而且我觉得比基于字符串的实现更简单)。你可以在像SqlAlchemy这样的ORM(对象关系映射)中找到这类东西,但我不知道是否有人已经为“普通”数据结构做过类似的事情(我猜人们觉得这并不是必要的?)

至于索引等等,我想你得去找真正的“对象数据库”……

3

我们正在推出PythonQL,它正好实现了你提到的功能(和C#的LINQ非常相似)。你可以在这里查看PythonQL的演示网站

8

Dee 是一种旨在为内存中的数据结构提供类似 SQL 的功能(作者更喜欢用关系演算来描述)。它有类似于 SQL 中的 GROUP BY 的功能,还有其他一切你需要的东西。

撰写回答