65 lines
1.7 KiB
Markdown
65 lines
1.7 KiB
Markdown
# Tables & DTOs
|
|
|
|
## BaseTable
|
|
|
|
`BaseTable[ItemType]` is a generic `SQLModel` subclass that acts as the database table. It is the bridge between your database and your application code.
|
|
|
|
### Without DTO mapping
|
|
|
|
If you don't need a separate data-transfer object, use `BaseTable` directly:
|
|
|
|
```python
|
|
class UserTable(BaseTable, table=True):
|
|
__tablename__ = "users"
|
|
id: int | None = Field(default=None, primary_key=True)
|
|
name: str
|
|
email: str = Field(unique=True)
|
|
```
|
|
|
|
Repository methods will return `UserTable` instances directly.
|
|
|
|
### With DTO mapping
|
|
|
|
When you want repository methods to return a separate Pydantic model instead of the raw table, specify a generic argument and implement `from_item` / `to_item`:
|
|
|
|
```python
|
|
from pydantic import BaseModel
|
|
from metaorm import BaseTable, Field
|
|
|
|
|
|
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)
|
|
```
|
|
|
|
Then pass `dto=User` to the repository:
|
|
|
|
```python
|
|
class UserRepository(BaseRepository, table=UserTable, filter_=UserFilter, dto=User):
|
|
pass
|
|
```
|
|
|
|
`BaseTable` also provides `to_values()` for insert / update operations.
|
|
|
|
## Introspection helpers
|
|
|
|
- `get_table_type()` — returns the SQLModel table class.
|
|
- `get_filter_type()` — returns the filter class.
|
|
- `get_dto_type()` — returns the DTO class or `None`.
|