An open API service indexing awesome lists of open source software.

https://github.com/bogdanp/hugs

Hugs lets you map SQL expressions to Python functions.
https://github.com/bogdanp/hugs

python sql

Last synced: 8 months ago
JSON representation

Hugs lets you map SQL expressions to Python functions.

Awesome Lists containing this project

README

          

# hugs

[![Build Status](https://travis-ci.org/Bogdanp/hugs.svg?branch=master)](https://travis-ci.org/Bogdanp/hugs)
[![PyPI version](https://badge.fury.io/py/hugs.svg)](https://badge.fury.io/py/hugs)

**hugs** lets you map SQL expressions to Python functions.

## Installation

pip install hugs

## Examples

### PostgreSQL

Write all your queries and commands in a plain `.sql` file. Command
names should end with a `!` character.

`queries.sql`:

``` sql
---
-- name: add_user!
-- args: username, password
-- doc: Adds a user.
INSERT INTO users (username, password) VALUES (%(username)s, %(password)s) RETURNING id;

---
-- name: get_users
SELECT * FROM users;
```

You can then point a `Repository` to that file to load it into memory:

`example.py`:

```python
import psycopg2

from hugs import Repository

connection = psycopg2.connect(database="postgres", user="bogdan")
connection.autocommit = True

users_repo = Repository()
users_repo.load_queries("queries.sql")

with connection.cursor() as cursor:
users_repo.add_user(cursor, "bogdan", "123")
users_repo.get_users(cursor)
print(cursor.fetchone())

connection.close()
```

You can use a `Manager` instead of (or in addition to) a `Repository`
to make iterating over query results less tedious.

```python
import psycopg2

from hugs import Manager

connection = psycopg2.connect(database="postgres", user="bogdan")
connection.autocommit = True

users_manager = Manager()
users_manager.load_queries("queries.sql")

with connection.cursor() as cursor:
users_manager.add_user(cursor, "bogdan", "123")
for user in users_manager.get_users(cursor):
print(user)

connection.close()
```

`Managers` optionally take a `value_factory` parameter that can be
used to convert rows to concrete data types.

```python
import psycopg2

from dataclasses import dataclass

@dataclass
class User:
id: Optional[int]
username: str
password: str

connection = psycopg2.connect(database="postgres", user="bogdan")
connection.autocommit = True

users_manager = Manager(User)
users_manager.load_queries("queries.sql")

with connection.cursor() as cursor:
for user in users_manager.get_users(cursor):
assert isinstance(user, User)

connection.close()
```

## License

hugs is licensed under the 3-clause BSD license.