Skip to content
forked from agateblue/lifter

A lightweight query engine for Python iterables, inspired by Django ORM

License

Notifications You must be signed in to change notification settings

kootenpv/lifter

 
 

Repository files navigation

What is lifter?

https://readthedocs.org/projects/lifter/badge/?version=latest https://travis-ci.org/EliotBerriot/lifter.svg?branch=master https://travis-ci.org/EliotBerriot/lifter.svg?branch=develop

Lifter is a lightweight query engine for Python iterables, inspired by Django ORM.

If you find if painful to gather data from collections of Python objects or dictionaries, such as API results, lifter is for you!

Warning: This package is still in alpha state and a lot of work is still needed to make queries faster and efficient. Contributions are welcome :)

Documentation is available at http://lifter.readthedocs.org

Features

  • Operates on plain objects or mapping (such as dictionaries)
  • API similar to Django querysets and SQLAlchemy
  • Lazy querysets
  • Composable queries
  • Lightweight: absolutely no dependencies
  • Tested and working on Python 2.7 to Python 3.5

Example usage

Consider the following list of users, returned from a REST API endpoint:

users = [
    {
        "is_active": True,
        "age": 35,
        "eye_color": "brown",
        "name": "Bernard",
        "gender": "male",
        "email": "bernard@blackbooks.com",
    },
    {
        "is_active": True,
        "age": 34,
        "eye_color": "brown",
        "name": "Manny",
        "gender": "male",
        "email": "manny@blackbooks.com",
    },
    {
        "is_active": True,
        "age": 35,
        "eye_color": "brown",
        "name": "Fran",
        "gender": "female",
        "email": "fran@blackbooks.com",
    },
    # And so on ...
]

Now, imagine you have to extract data from this list. Let's compare how you can do this using regular Python and lifter.

To use lifter in your project, you'll only need the following instructions:

import lifter

User = lifter.models.Model('User')
manager = User.load(users)

Getting getting all active 26 years old users:

# vanilla Python
results = [
    user for user in users
    if user['age'] == 26 and user['is_active']
]

# lifter
results = manager.filter(User.age == 26, User.is_active == True)

Getting names and emails of inactive users under 56:

# vanilla Python
results = [
    (user['name'], user['email']) for user in users
    if not user['is_active'] and user['age'] < 56
]

# lifter
results = manager.filter(User.is_active == False, User.age < 56)\
                 .values_list('name', 'email')

Getting all active users except the one with brown eyes and sort them by age:

# vanilla Python
raw_results = [
    user for user in users
    if user['is_active'] and not user['eye_color'] == 'brown'
]
results = sorted(raw_results, key=lambda v: v['age'])

# lifter
results = manager.filter(User.is_active == True)\
                 .exclude(User.eye_color == 'brown')\
                 .order_by('age')

Getting minimum and average women age:

# vanilla Python
from statistics import mean # Only in Python >=3.4
women_ages = [
    user['age'] for user in users
    if user['gender'] == 'female'
]
women_average_age = mean(women_ages)
minimum_woman_age = min(women_ages)

# lifter
results = manager.filter(User.gender='female')\
                 .aggregate((User.age, mean), (User.age, min))

As you can see, lifter's version is shorter and more readable than vanilla Python. It's also less error prone, especially if you're writing really complex queries, and quite familiar if you've already used an ORM.

Wanna know more? Have a look at the documentation!

About

A lightweight query engine for Python iterables, inspired by Django ORM

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 97.7%
  • Makefile 2.3%