【问题标题】:Query language for python objects [closed]python对象的查询语言[关闭]
【发布时间】:2011-07-04 20:22:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 非常好的问题。我很好奇这是否有特定的术语。

标签: python object-oriented-database


【解决方案1】:

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

【讨论】:

  • 我不确定我是否可以真正使用它,但它看起来很吸引人。关系方面让我想起了一点 Prolog。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我猜人们并不觉得有必要?这可能很有帮助。您可以更进一步,允许使用 XPath 访问 python 对象。更进一步,您可以对 Python 对象进行 XSL 转换...
  • @Piotr:我同意这可能会有所帮助。只是它似乎不存在(或者至少不是主流),虽然它应该是可能的,所以......至于 Python 对象上的 XSL 转换:我不确定我想去那里;-) (相反,我不是 xslt 仇恨者,但有时值得考虑一下 DSL 代表什么字母)
  • 我不确定我想去那里 ;-) 我明白你的意思。当您经常必须处理此类任务时,这是有道理的。在这种情况下,我看到了这些想法的用处。
  • 是的,生成器表达式与 itertools 结合起来非常好。不仅在语法方面,如果操作正确,从 [] 切换到 () 也可以节省大量内存。
【解决方案3】:

SQL 的作用与您在惯用 Python 中可以做的一个主要区别是,在 SQL 中,您告诉评估者您正在寻找什么信息,它会根据它持有的数据。在 python 中,你只能告诉解释器如何你想要数据,没有查询计划器的等价物。

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

首先,使用与 SQL 的声明性性质非常相似的结构。其中许多是内置的。 mapfilterreducezipallanysorted,以及operatorfunctoolsitertools包的内容一种相当简洁的数据查询表达方式。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      看看sql4csv 是否有帮助。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我们正在推出 PythonQL,它完全符合您的要求(它与 C# LINQ 非常相似)。 PythonQL demo site

          【讨论】: