我正在寻找一个允许我在python“对象数据库”上运行类似SQL的查询的库。对于对象数据库,我指的是内存中相当复杂的python对象和列表结构。基本上这将是一个“反向ORM” - 它不是为关系数据库提供面向对象的接口,而是为对象数据库提供一个SQL-ish接口。
C#的LINQ非常接近。 Python的列表推导非常好,但是在执行复杂的事情(排序,连接等)时语法会变得毛茸茸。此外,我无法(轻松)使用列表推导动态创建查询。
实际语法可以是基于字符串的,也可以使用面向对象的DSL(来自(mylist).select(...))。如果图书馆提供某种索引来加速搜索,则可获得奖励。
这是否存在或我必须发明它?
答案 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:熟悉的if
和for
子句,而不是引入where
和{{1等等)。
面向对象的DSL方法似乎是可行的(我认为比基于字符串更容易实现)。你会在像SqlAlchemy这样的ORM中找到这种东西,但我不知道是否有人已经为“普通”数据结构做了这些事情(我想人们真的不觉得这是必要的吗?)
对于索引等:我猜你必须搜索实际的“对象数据库”...
答案 2 :(得分:2)
SQL在SQL中做了什么和你可以做什么之间的一个主要区别,在SQL中,你告诉评估者你正在寻找什么信息,并且它找出了基于结构的最有效的方法来检索它。它拥有的数据。在python中,你只能告诉解释器你想要数据的,没有与查询计划器等效的东西。
也就是说,除了列表推导之外还有一些额外的工具可以帮助很多。
首先,使用一个非常类似于SQL的声明性质的结构。其中许多是内置的。 map
,filter
,reduce
,zip
,all
,any
,sorted
以及operator
的内容{1}},functools
和itertools
个软件包都提供了一种表达数据查询的简洁方式。
答案 3 :(得分:1)
不完全是您描述的内容,但littletable适用于内存中的对象列表,支持联接,枢轴,查询。而每个结果又是另一个小表,所以你可以轻松地执行一系列过滤步骤。
答案 4 :(得分:1)
我遇到了这个,因为我正在寻找一个好的库来支持类似的用例。事实证明,Pandas可以很好地适用于需要按类型进行连接/分组或时间序列处理的情况。
答案 5 :(得分:1)
我们正在启动PythonQL,它正是你所提到的(它与C#LINQ非常相似)。 PythonQL demo site
答案 6 :(得分:0)
查看sql4csv是否有帮助。