Use your pydantic models as an ORM, storing data in Redis.
Project description
pydantic-aioredis
A simple declarative ORM for Redis, using aioredis. Use your Pydantic models like an ORM, storing data in Redis!
Inspired by pydantic-redis by Martin Ahindura
Main Dependencies
Getting Started
Examples
Examples are in the examples/ directory of this repo.
Installation
Install the package
pip install pydantic-aioredis
Quick Usage
Import the Store
, the RedisConfig
and the Model
classes and use accordingly
import asyncio
from datetime import date
from pydantic_aioredis import RedisConfig, Model, Store
# Create models as you would create pydantic models i.e. using typings
class Book(Model):
_primary_key_field: str = 'title'
title: str
author: str
published_on: date
in_stock: bool = True
# Do note that there is no concept of relationships here
class Library(Model):
# the _primary_key_field is mandatory
_primary_key_field: str = 'name'
name: str
address: str
# Create the store and register your models
store = Store(name='some_name', redis_config=RedisConfig(db=5, host='localhost', port=6379), life_span_in_seconds=3600)
store.register_model(Book)
store.register_model(Library)
# Sample books. You can create as many as you wish anywhere in the code
books = [
Book(title="Oliver Twist", author='Charles Dickens', published_on=date(year=1215, month=4, day=4),
in_stock=False),
Book(title="Great Expectations", author='Charles Dickens', published_on=date(year=1220, month=4, day=4)),
Book(title="Jane Eyre", author='Charles Dickens', published_on=date(year=1225, month=6, day=4), in_stock=False),
Book(title="Wuthering Heights", author='Jane Austen', published_on=date(year=1600, month=4, day=4)),
]
# Some library objects
libraries = [
Library(name="The Grand Library", address="Kinogozi, Hoima, Uganda"),
Library(name="Christian Library", address="Buhimba, Hoima, Uganda")
]
async def work_with_orm():
# Insert them into redis
await Book.insert(books)
await Library.insert(libraries)
# Select all books to view them. A list of Model instances will be returned
all_books = await Book.select()
print(all_books) # Will print [Book(title="Oliver Twist", author="Charles Dickens", published_on=date(year=1215, month=4, day=4), in_stock=False), Book(...]
# Or select some of the books
some_books = await Book.select(ids=["Oliver Twist", "Jane Eyre"])
print(some_books) # Will return only those two books
# Or select some of the columns. THIS RETURNS DICTIONARIES not MODEL Instances
# The Dictionaries have values in string form so you might need to do some extra work
books_with_few_fields = await Book.select(columns=["author", "in_stock"])
print(books_with_few_fields) # Will print [{"author": "'Charles Dickens", "in_stock": "True"},...]
# When _auto_sync = True (default), updating any attribute will update that field in Redis too
this_book = Book(title="Moby Dick", author='Herman Melvill', published_on=date(year=1851, month=10, day=18))
await Book.insert(this_book)
# oops, there was a typo. Fix it
this_book.author = "Herman Melville"
this_book_from_redis = await Book.select(ids=["Moby Dick"])
assert this_book_from_redis[0].author == "Herman Melville"
# If you have _auto_save set to false on a model, you have to await .save() to update a model in tedis
await this_book.save()
# Delete any number of items
await Library.delete(ids=["The Grand Library"])
# Now run these updates
loop = asyncio.get_event_loop()
loop.run_until_complete(work_with_orm())
Custom Fields in Model
Field Name | Required | Default | Description |
---|---|---|---|
_primary_key_field | Yes | None | The field of your model that is the primary key |
_redis_prefix | No | None | If set, will be added to the beginning of the keys we store in redis |
_redis_separator | No | : | Defaults to :, used to separate prefix, table_name, and primary_key |
_table_name | NO | cls.name | Defaults to the model's name, can set a custom name in redis |
Contributing
Contributions are very welcome. To learn more, see the Contributor Guide
License
Licensed under the MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pydantic-aioredis-1.0.0.tar.gz
(13.3 kB
view hashes)
Built Distribution
Close
Hashes for pydantic_aioredis-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7ee6fb29b123a444e03d8dd4bdac1ded470f93ea4a9406d9342871090cae97fa |
|
MD5 | e4acc1a70d4e97c546e3d9cdac54c5ec |
|
BLAKE2b-256 | 9aee2a3b5af922a020c6f47a1209932015da64540176777431e6f294b7ad001d |