Dataclass aware ORM with pluggable backends (DynamoDB included).
Install virtual environment and dependencies using make install
$ make install
$ source venv/bin/activate
(venv) $
Start the compose stack, which runs local versions of dynamodb and api gateway
(venv) $ docker compose up -d
Run the example below using:
(venv) $ export DYNAMODB=http://localhost:8009
(venv) $ python example/widgets.py
from dataclasses import dataclass
from flex import FlexObject
@dataclass
class Inventory(FlexObject):
quantity: int = 0
@classmethod
@property
def sort_key(cls) -> str:
return 'quantity'
@dataclass
class Button(Inventory):
type: str = "square"
widget: str = None
@dataclass
class Widget(Inventory):
theme: str = "default"
_buttons = [Button(name="button zero", quantity=5, id="button0")]
@property
def buttons(self) -> []:
buttons = self.relation(Button, backref='widget')
return buttons
@buttons.setter
def buttons(self, buttons: str) -> None:
for button in buttons:
button.widget = self.id
self._buttons = buttons
def save(self):
super(Widget, self).save()
for button in self._buttons:
button.save()
# SCENARIO 1:
# Create table, Button, Widget, Add Buton to Widget. Save Widget
""" Create tables """
Button.create_table(skip_exists=True)
Widget.create_table(skip_exists=True)
""" Create a Button """
button1 = Button(name="button one", quantity=5, id="button1")
""" Create a Widget """
wid1 = Widget(name="widget one", quantity=10, id="widget1")
""" Add a button to widget1's existing list of buttons """
wid1.buttons += [button1]
print("WID1", wid1, wid1.buttons)
""" Save widget 1 """
wid1.save()
""" Create another widget """
wid2 = Widget(name="widget two", quantity=15, id="widget2")
wid2.save()
# SCENARIO 2:
# Issue SQL to find Widgets
""" Execute arbitrary SQL on the Widget table """
results = Widget.execute(f"SELECT * FROM \"Widget\" WHERE quantity<? and id=?", [15, 'widget1'])
for result in results:
print("RESULT:", result, result.buttons)
# Find widgets using template object
""" Find Widget objects using template """
results = Widget.find({'id': 'widget1'}, response=True)
print("FIND:", results.response)
for result in results.all():
print("RESULT:", result, result.buttons)
# SCENARIO 3:
# Delete specific widget by instance
""" Delete widget instance using instance method"""
print("DELETE widget1", wid1.delete().response)
# SCENARIO 4:
# Delete specific widget by template object
""" Try to find deleted object """
print("FIND2", Widget.find({'id': 'widget1', 'name': 'widget one'}))
# SCENARIO 5:
# Create table, Add Inventory Items
""" Create tables """
Inventory.create_table(skip_exists=True)
""" Create some Inventory objects and save them """
inv = Inventory(name="item", quantity=10, id="item1")
inv.save()
inv = Inventory(name="item", quantity=20, id="item2")
inv.save()
""" Delete widget2 using Class.delete(...)
print("DELETE widget2", Widget.delete({'id': 'widget2', 'quantity': 15}))
results = Widget.execute(f"DELETE FROM \"Widget\" WHERE quantity=? and name='widget one' and id=?", [10, 'widget1'])
print(results)
"""