Use your pydantic models as an ORM, storing data in Redis.
Reason this release was yanked:
Bugs in handling of complex types
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"},...]
this_book = Book(title="Moby Dick", author='Herman Melvill', published_on=date(year=1851, month=10, day=17))
await Book.insert(this_book)
# oops, there was a typo. Fix it
# Update is an async context manager and will update redis with all changes in one operations
async with this_book.update():
this_book.author = "Herman Melville"
this_book.published_on=date(year=1851, month=10, day=18)
this_book_from_redis = await Book.select(ids=["Moby Dick"])
assert this_book_from_redis[0].author == "Herman Melville"
assert this_book_from_redis[0].author == date(year=1851, month=10, day=18)
# 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 |
_auto_save | No | False | Defaults to false. If true, will save to redis on instantiation |
_auto_sync | No | False | Defaults to false. If true, will save to redis on attr update |
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.2.0.tar.gz
(15.1 kB
view hashes)
Built Distribution
Close
Hashes for pydantic_aioredis-1.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1e31c15799699afbd4504e71d6884305a682dabaa62db5e6c6be38bcc9c31d55 |
|
MD5 | 218c3cf8333c4d12b32cf2f815d2d682 |
|
BLAKE2b-256 | a478c90a81ec72b4b3d92888c036a7a767851e94566402a8a769c7755adb1f4e |