Files
MetaORM/examples/dto_usage.py

63 lines
1.5 KiB
Python

import asyncio
from pydantic import BaseModel
from metaorm import BaseFilter, BaseRepository, BaseTable, Field, RepositorySettings
class User(BaseModel):
id: int | None = None
name: str
email: str
class UserTable(BaseTable[User], table=True):
__tablename__ = "users"
id: int | None = Field(default=None, primary_key=True)
name: str
email: str = Field(unique=True)
@classmethod
def from_item(cls, item: User) -> "UserTable":
return cls(id=item.id, name=item.name, email=item.email)
def to_item(self) -> User:
return User(id=self.id, name=self.name, email=self.email)
class UserFilter(BaseFilter):
name: str | None = None
email: str | None = None
class UserRepository(BaseRepository, table=UserTable, filter_=UserFilter, dto=User):
pass
async def main() -> None:
settings = RepositorySettings(dsn="sqlite+aiosqlite:///:memory:")
repository = UserRepository(settings=settings)
await repository.create_tables()
# Create using DTO
user = await repository.create_item(
User(name="Alice", email="alice@example.com"),
)
print(f"Created DTO: {user.model_dump()}")
# Read single DTO
single = await repository.get_item(
filter_=UserFilter(email="alice@example.com"),
)
print(f"Single DTO: {single.model_dump() if single else None}")
# Read all — returned as DTOs
items = [item async for item in repository.get_items()]
print(f"Items as DTOs: {[item.model_dump() for item in items]}")
if __name__ == "__main__":
asyncio.run(main())