Bogdanp/hugs

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# 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.