No project description provided
Project description
DBDM [wip]
Examples
from typing import ClassVar, Type
import sqlalchemy as sa
from cwtch import dataclass, resolve_types, view
from cwtch.types import UNSET, Unset
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from sqlalchemy.ext.asyncio import create_async_engine
from dbdm import DM, NotFoundError, bind_engine
class BaseDB(DeclarativeBase):
pass
class ParentDB(BaseDB):
__tablename__ = "parents"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str]
data: Mapped[str]
children = relationship("ChildDB", uselist=True, viewonly=True)
class ChildDB(BaseDB):
__tablename__ = "children"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str]
parent_id: Mapped[int] = mapped_column(sa.ForeignKey("parents.id"))
parent = relationship("ParentDB", uselist=False, viewonly=True)
@dataclass(handle_circular_refs=True)
class Parent:
id: int
name: str
data: str
children: Unset[list["Child"]] = UNSET
# Parent views
Create: ClassVar[Type["ParentCreate"]]
Save: ClassVar[Type["ParentSave"]]
Update: ClassVar[Type["ParentUpdate"]]
@view(Parent, "Create", exclude=["id", "children"])
class ParentCreate:
pass
@view(Parent, "Save", exclude=["children"])
class ParentSave:
pass
@view(Parent, "Update", exclude=["children"])
class ParentUpdate:
name: Unset[str] = UNSET
data: Unset[str] = UNSET
@dataclass(handle_circular_refs=True)
class Child:
id: int
name: str
parent_id: int
parent: Unset[Parent] = UNSET
# Child views
Create: ClassVar[Type["ChildCreate"]]
Save: ClassVar[Type["ChildSave"]]
Update: ClassVar[Type["ChildUpdate"]]
@view(Child, "Create", exclude=["id", "parent"])
class ChildCreate:
pass
@view(Child, "Save", exclude=["parent"])
class ChildSave:
pass
@view(Child, "Update", exclude=["parent"])
class ChildUpdate:
name: Unset[str] = UNSET
parent_id: Unset[int] = UNSET
resolve_types(Parent, globals(), locals())
class ParentDM(DM):
model_db = ParentDB
model = Parent
model_create = Parent.Create
model_save = Parent.Save
model_update = Parent.Update
key = "id"
index_elements = ["id"]
joinedload = {"children": lambda m: sa.orm.joinedload(m.children)}
class ChildDM(DM):
model_db = ChildDB
model = Child
model_create = Child.Create
model_save = Child.Save
model_update = Child.Update
key = "id"
index_elements = ["id"]
joinedload = {"parent": lambda m: sa.orm.joinedload(m.parent)}
@pytest_asyncio.fixture
async def create_all(engine):
async with engine.begin() as conn:
await conn.run_sync(BaseDB.metadata.create_all)
async def example(engine):
engine = create_async_engine(...)
async with engine.begin() as conn:
await conn.run_sync(BaseDB.metadata.create_all)
bind_engine(engine)
parent = await ParentDM.create(Parent.Create(name=f"Parent_{i}", data="data"))
# parents: list[Parent]
total, parents = await ParentDM.get_many()
# parents: list[Parent]
total, parents = await ParentDM.get_many(page_size=1)
# parents: list[Parent]
total, parents = await ParentDM.get_many(page_size=1, page=2)
# parent: Parent
parent = await ParentDM.get(1)
# parent: Parent
parent = await ParentDM.get(1, joinedload={"children": True})
# parent: Parent
parent = await ParentDM.save(parent.Save())
# parent: Parent
parent = await ParentDM.update(Parent.Update(id=1, data="new data"), key="id")
await ParentDM.delete(1)
# child : Child
child = await ChildDM.create(Child.Create(name=f"Child_{i}", parent_id=i))
# parent: Parent
parent = await ParentDM.get(1, joinedload={"children": True})
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
dbdm-0.1.0.tar.gz
(8.6 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
dbdm-0.1.0-py3-none-any.whl
(9.0 kB
view details)
File details
Details for the file dbdm-0.1.0.tar.gz.
File metadata
- Download URL: dbdm-0.1.0.tar.gz
- Upload date:
- Size: 8.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.11.9 Darwin/23.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
78404d3eab9d9bc54e3bec946202b7c739d5ee483d0e49ed25979d7eb884d938
|
|
| MD5 |
233414c8adb488d976ee7173fedb7bf2
|
|
| BLAKE2b-256 |
daa225e60320dacd2d1273ce6693d7497e29a04500638e38ecfdadb28cc54bb6
|
File details
Details for the file dbdm-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dbdm-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.11.9 Darwin/23.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a830d6b56e2586b9c169acca6994a3937da890d9675085b475e22f62bea59d5
|
|
| MD5 |
d1d4d822e4c31d819ae04e7208c00a1a
|
|
| BLAKE2b-256 |
02cea0d5efaf73da2b6f7f5f4a38a89a19e291442946d2cc4361c097045e87eb
|