python对象的查询语言

时间:2011-02-26 12:03:42

标签: python object-oriented-database

我正在寻找一个允许我在python“对象数据库”上运行类似SQL的查询的库。对于对象数据库,我指的是内存中相当复杂的python对象和列表结构。基本上这将是一个“反向ORM” - 它不是为关系数据库提供面向对象的接口,而是为对象数据库提供一个SQL-ish接口。

C#的LINQ非常接近。 Python的列表推导非常好,但是在执行复杂的事情(排序,连接等)时语法会变得毛茸茸。此外,我无法(轻松)使用列表推导动态创建查询。

实际语法可以是基于字符串的,也可以使用面向对象的DSL(来自(mylist).select(...))。如果图书馆提供某种索引来加速搜索,则可获得奖励。

这是否存在或我必须发明它?

7 个答案:

答案 0 :(得分:6)

Dee的目标是成为内存结构的SQL(ish;作者更喜欢关系演算)。有一个GROUP BY等价物和所有东西。

答案 1 :(得分:2)

如果您喜欢列表推导,请不要忘记他们的“懒惰”对象:generator expressions。这些至少在某种程度上解决了动态构造查询的问题。用itertools补充这个,当然还有一些用于迭代的builtin functions,你可以说你有Python“LINQ to Object”(或者至少非常接近)。

你不会像在C#和LINQ中那样在python中内置“pseudo-sql”语法,但我觉得这是一个品味问题。 (就我个人而言,我喜欢它仍然是Python,使用相同的关键字等而不是试图成为sql:熟悉的iffor子句,而不是引入where和{{1等等)。

面向对象的DSL方法似乎是可行的(我认为比基于字符串更容易实现)。你会在像SqlAlchemy这样的ORM中找到这种东西,但我不知道是否有人已经为“普通”数据结构做了这些事情(我想人们真的不觉得这是必要的吗?)

对于索引等:我猜你必须搜索实际的“对象数据库”...

答案 2 :(得分:2)

SQL在SQL中做了什么和你可以做什么之间的一个主要区别,在SQL中,你告诉评估者你正在寻找什么信息,并且它找出了基于结构的最有效的方法来检索它。它拥有的数据。在python中,你只能告诉解释器你想要数据的,没有与查询计划器等效的东西。

也就是说,除了列表推导之外还有一些额外的工具可以帮助很多。

首先,使用一个非常类似于SQL的声明性质的结构。其中许多是内置的。 mapfilterreducezipallanysorted以及operator的内容{1}},functoolsitertools个软件包都提供了一种表达数据查询的简洁方式。

答案 3 :(得分:1)

不完全是您描述的内容,但littletable适用于内存中的对象列表,支持联接,枢轴,查询。而每个结果又是另一个小表,所以你可以轻松地执行一系列过滤步骤。

答案 4 :(得分:1)

我遇到了这个,因为我正在寻找一个好的库来支持类似的用例。事实证明,Pandas可以很好地适用于需要按类型进行连接/分组或时间序列处理的情况。

答案 5 :(得分:1)

我们正在启动PythonQL,它正是你所提到的(它与C#LINQ非常相似)。 PythonQL demo site

答案 6 :(得分:0)

查看sql4csv是否有帮助。