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 |
License
Licensed under the MIT License
Contributing
Contributions are very welcome. To learn more, see the Contributor Guide
Contributors
Thanks go to these wonderful people (emoji key):
Andrew 💻 📖 |
Martin Ahindura 💻 🤔 |
david-wahlstedt ⚠️ 📖 👀 |
Daniel Wallace ⚠️ |
Paco Nathan 💡 |
Andreas Brodersen 📖 |
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.1.1.tar.gz
(14.6 kB
view hashes)
Built Distribution
Close
Hashes for pydantic_aioredis-1.1.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5f33dc8e6225fd5b1a1a82ee98c32dd23db30890375a16bab72afe09b0bac04 |
|
MD5 | bab9858552cf5b4699ce5441c6aeae53 |
|
BLAKE2b-256 | f3160e0eb401065939f68c0e327343d87374540046f6b6f5517402c67eb65350 |