Python对象查询语言
我在找一个库,可以让我在Python的“对象数据库”上运行类似SQL的查询。这里的对象数据库指的是在内存中比较复杂的Python对象和列表的结构。简单来说,这就像是一个“反向ORM”——它不是给关系数据库提供面向对象的接口,而是给对象数据库提供类似SQL的接口。
C#的LINQ很接近这个想法。Python的列表推导式也很好用,但当要做复杂操作(比如排序、连接等)时,语法就变得有点复杂了。而且,我不能(很容易地)用列表推导式动态创建查询。
实际的语法可以是基于字符串的,或者使用面向对象的领域特定语言(比如像这样:from(mylist).select(...))。如果这个库还能提供某种索引来加速搜索,那就更好了。
这种东西存在吗,还是我得自己发明一个?
7 个回答
如果你喜欢列表推导式,别忘了它们的“懒惰”版本:生成器表达式。这些东西在某种程度上可以帮助你动态构建查询。再加上itertools库,以及一些可以处理可迭代对象的内置函数,你可以说你拥有了类似于Python的“LINQ to Object”(或者至少是非常接近的东西)。
在Python中,你不会像在C#和LINQ中那样得到“伪SQL”语法,但这可能只是个人喜好问题。(就我个人而言,我喜欢它保持Python的风格,使用相同的关键字等,而不是试图变成SQL:使用熟悉的if
和for
语句,而不是引入where
和from
等等)。
面向对象的DSL(领域特定语言)方法似乎是可行的(而且我觉得比基于字符串的实现更简单)。你可以在像SqlAlchemy这样的ORM(对象关系映射)中找到这类东西,但我不知道是否有人已经为“普通”数据结构做过类似的事情(我猜人们觉得这并不是必要的?)
至于索引等等,我想你得去找真正的“对象数据库”……
我们正在推出PythonQL,它正好实现了你提到的功能(和C#的LINQ非常相似)。你可以在这里查看PythonQL的演示网站。
Dee 是一种旨在为内存中的数据结构提供类似 SQL 的功能(作者更喜欢用关系演算来描述)。它有类似于 SQL 中的 GROUP BY 的功能,还有其他一切你需要的东西。