Язык запросов для объектов python

Я ищу библиотеку, которая позволяет запускать SQL-подобные запросы на базе данных объектов python. С объектной базой данных я имею в виду довольно сложную структуру объектов и списков python в памяти. В основном это было бы "обратная ORM" - вместо предоставления объектно-ориентированного интерфейса реляционной базе данных он обеспечивал бы интерфейс SQL-ish для базы данных объектов.

С# LINQ очень близок. Понимание списков Python очень приятно, но синтаксис становится волосатым при выполнении сложных вещей (сортировка, объединение и т.д.). Кроме того, я не могу (легко) создавать запросы динамически со списком.

Фактический синтаксис может быть либо строковым, либо использовать объектно-ориентированную DSL (a la from (mylist).select(...)). Бонусные баллы, если библиотека предоставит какие-то индексы для ускорения поиска.

Есть ли это или я должен его изобрести?

Ответ 1

Dee стремится быть SQL (ish; автор предпочитает реляционное исчисление) для структур в памяти. Там есть эквивалент GROUP BY и все.

Ответ 2

Если вам нравятся перечни, не забывайте об их "ленивом" коллеге: выражения генератора. Они должны по крайней мере в какой-то мере решить вопрос о динамическом построении запросов. Дополните это itertools, и, конечно, некоторые из встроенных функций, которые работают с итерабельными, и вы можете сказать, что у вас есть свой Python "LINQ to Object" (или, по крайней мере, что-то очень близкое).

Вы не получите синтаксис "псевдо-sql", встроенный в python, как с С# и LINQ, но это вопрос вкуса, я думаю. (лично мне нравится, что он остается Python, использует те же ключевые слова и т.д. вместо того, чтобы пытаться быть sql: знакомыми if и for предложениями вместо того, чтобы вводить where и from и т.д.).

Объектно-ориентированный подход DSL представляется выполнимым (и проще реализовать, чем, по-моему, на основе строк). Вы найдете такие вещи в ORM, как SqlAlchemy, но я не знаю, сделал ли кто-то это уже для "нормальных" структур данных (я думаю, люди действительно не считают это необходимым?)

Для индексов и т.д.: Думаю, вам придется искать фактические "базы данных объектов"...

Ответ 3

Одно существенное различие между тем, что делает SQL, и тем, что вы можете сделать на идиоматическом питоне, в SQL, вы скажите оценщику, какую информацию вы ищете, и он выработает наиболее эффективный способ извлечения, основанный на структуре данных. В python вы можете только сообщить интерпретатору, как вы хотите данные, нет эквивалента планировщику запросов.

Тем не менее, есть несколько дополнительных инструментов, которые выходят за рамки передовых понятий, которые помогают много.

Сначала используйте структуру, которая очень похожа на декларативный характер SQL. Многие из них являются встроенными. map, filter, reduce, zip, all, any, sorted, а также содержимое пакетов operator, functools и itertools, все предлагают довольно сжатый способ выражения запросов данных.

Ответ 4

Не совсем то, что вы описываете, но littletable работает со списками объектов в памяти, поддерживает объединения, свопы, запросы. И каждый результат, в свою очередь, является другим, что позволяет легко выполнить последовательность шагов фильтрации.

Ответ 5

Я столкнулся с этим, поскольку искал хорошую библиотеку для поддержки аналогичного варианта использования. Оказывается, что Pandas отлично работает для случаев, когда требуются соединения/группы по типам запросов или для обработки временных рядов.

Ответ 6

Мы запускаем PythonQL, который делает именно то, что вы упоминаете (его очень похоже на С# LINQ). Демо-сайт PythonQL

Ответ 7

Посмотрите, может ли sql4csv помочь.