Язык запросов для объектов Python - PullRequest
14 голосов
/ 26 февраля 2011

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

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

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

Это существует или я должен изобрести это?

Ответы [ 7 ]

7 голосов
/ 26 февраля 2011

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

2 голосов
/ 26 февраля 2011

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

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

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

2 голосов
/ 26 февраля 2011

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

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

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

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

1 голос
/ 14 октября 2016

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

1 голос
/ 25 ноября 2015

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

1 голос
/ 26 февраля 2011

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

0 голосов
/ 04 июля 2011

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

...