27 lines
887 B
Python
27 lines
887 B
Python
from datetime import UTC, datetime
|
|
from typing import Any
|
|
|
|
from sqlalchemy import event
|
|
from sqlalchemy.engine import Connection
|
|
from sqlalchemy.orm import Mapper
|
|
from sqlmodel import Field, SQLModel
|
|
|
|
|
|
class BaseModel(SQLModel):
|
|
"""Base model with common fields for all models."""
|
|
|
|
id: int | None = Field(primary_key=True, default=None)
|
|
|
|
# timestamps
|
|
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
|
|
|
|
# SQLAlchemy event listener to automatically update updated_at timestamp
|
|
@event.listens_for(BaseModel, "before_update", propagate=True)
|
|
def update_timestamp(
|
|
mapper: Mapper[Any], connection: Connection, target: BaseModel, # noqa: ARG001
|
|
) -> None:
|
|
"""Automatically set updated_at timestamp before update operations."""
|
|
target.updated_at = datetime.now(UTC)
|