17

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

C# 的 LINQ 非常接近。Python 的列表解析非常好,但是在处理复杂的事情(排序、连接等)时语法会变得很复杂。此外,我不能(轻松)使用列表推导动态创建查询。

实际的语法可以是基于字符串的,也可以使用面向对象的 DSL(a la from(mylist).select(...))。如果图书馆会提供某种索引来加快搜索速度,则可以加分。

这存在还是我必须发明它?

4

7 回答 7

8

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

于 2011-02-26T12:12:38.613 回答
3

我们正在启动 PythonQL,它与您提到的完全一样(它与 C# LINQ 非常相似)。PythonQL 演示站点

于 2016-10-14T19:20:44.030 回答
2

与您描述的不完全一样,但littletable可用于内存中的对象列表,支持连接、枢轴、查询。每个结果又是另一个小表,因此您可以轻松执行一系列过滤步骤。

于 2011-02-26T15:44:45.433 回答
2

如果你喜欢列表推导,不要忘记它们的“懒惰”对应物:生成器表达式。这些至少在一定程度上解决了动态构建查询的问题。用itertools来补充它,当然还有一些在 iterables 上工作的内置函数,你可以说你有你的 Python “LINQ to Object”(或者至少是非常接近的东西)。

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

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

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

于 2011-02-26T14:00:17.737 回答
2

SQL 所做的与您在惯用的 Python 中所做的之间的一个主要区别是,在 SQL 中,您告诉评估者您正在寻找什么信息,它会根据它所拥有的数据结构找出最有效的检索方法. 在 python 中,你只能告诉解释器想要的数据,没有查询计划器的等价物。

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

首先,使用与 SQL 的声明性质非常相似的结构。其中许多是内置的。 map, filter, reduce, zip, all, any,sorted以及operator,functoolsitertools包的内容都提供了一种相当简洁的方式来表达数据查询。

于 2011-02-26T15:35:36.227 回答
1

看看sql4csv是否有帮助。

于 2011-07-03T22:01:41.743 回答
1

我在寻找一个支持类似用例的好库时遇到了这个问题。事实证明,Pandas非常适用于需要按类型查询加入/分组或时间序列处理的情况。

于 2015-11-24T21:55:26.650 回答