python对象的查询语言

2024-05-23 14:12:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

C的行距很近。Python的列表理解非常好,但是当做复杂的事情(排序、连接等)时,语法变得毛茸茸的。而且,我不能(轻松地)使用列表理解动态创建查询。

实际语法可以是基于字符串的,也可以使用面向对象的DSL(来自(mylist).select(…))。如果图书馆能提供某种索引来加快搜索速度,就可以获得额外的积分。

这是存在的还是我必须创造它?


Tags: 对象内存字符串数据库列表sql排序orm
3条回答

SQL所做的和在习惯的python中所能做的一个主要区别是,在SQL中,你告诉求值器你在寻找什么样的信息,并且它根据它所保存的数据的结构找出了最有效的检索方法。在python中,您只能告诉解释器如何需要数据,没有等价于查询计划器。

也就是说,除了列表理解之外,还有一些额外的工具可以帮助您。

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

Dee旨在将SQL(ish;作者更喜欢关系演算)用于内存结构。有一个等价物和所有东西的组合。

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

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

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

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

相关问题 更多 >