From c0e35c4c3f40fac61a92569e08cab5d6e1981cbc Mon Sep 17 00:00:00 2001 From: Artem Litvinov Date: Mon, 2 Oct 2023 20:07:19 +0100 Subject: [PATCH] build: add models --- src/fastapi_app/lib/models/__init__.py | 5 +-- src/fastapi_app/lib/models/base_sqlalchemy.py | 36 ------------------- src/fastapi_app/lib/models/orm/__init__.py | 4 +++ src/fastapi_app/lib/models/orm/base.py | 35 ++++++++++++++++++ src/fastapi_app/lib/models/orm/joke.py | 13 +++++++ 5 files changed, 55 insertions(+), 38 deletions(-) delete mode 100644 src/fastapi_app/lib/models/base_sqlalchemy.py create mode 100644 src/fastapi_app/lib/models/orm/__init__.py create mode 100644 src/fastapi_app/lib/models/orm/base.py create mode 100644 src/fastapi_app/lib/models/orm/joke.py diff --git a/src/fastapi_app/lib/models/__init__.py b/src/fastapi_app/lib/models/__init__.py index 33fb529..db9c34f 100644 --- a/src/fastapi_app/lib/models/__init__.py +++ b/src/fastapi_app/lib/models/__init__.py @@ -1,4 +1,5 @@ -from .base_sqlalchemy import Base, IdCreatedUpdatedBaseMixin +from .joke import Joke +from .orm import Base, IdCreatedUpdatedBaseMixin, JokeORM from .token import Token -__all__ = ["Base", "IdCreatedUpdatedBaseMixin", "Token"] +__all__ = ["Base", "IdCreatedUpdatedBaseMixin", "Joke", "JokeORM", "Token"] diff --git a/src/fastapi_app/lib/models/base_sqlalchemy.py b/src/fastapi_app/lib/models/base_sqlalchemy.py deleted file mode 100644 index 2023439..0000000 --- a/src/fastapi_app/lib/models/base_sqlalchemy.py +++ /dev/null @@ -1,36 +0,0 @@ -import uuid - -import sqlalchemy -import sqlalchemy.dialects.postgresql -import sqlalchemy.ext.declarative -import sqlalchemy.orm - - -class Base(sqlalchemy.orm.DeclarativeBase): - """Base class for all models.""" - - pass - - -class IdCreatedUpdatedBaseMixin(Base): - @sqlalchemy.ext.declarative.declared_attr - def uuid(cls): - return sqlalchemy.Column( - sqlalchemy.dialects.postgresql.UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid4, - unique=True, - nullable=False, - ) - - @sqlalchemy.ext.declarative.declared_attr - def created_at(cls): - return sqlalchemy.Column(sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()) - - @sqlalchemy.ext.declarative.declared_attr - def updated_at(cls): - return sqlalchemy.Column(sqlalchemy.DateTime, server_default=sqlalchemy.sql.func.now()) - - @sqlalchemy.ext.declarative.declared_attr.directive - def __tablename__(cls) -> str: - return cls.__name__.lower() diff --git a/src/fastapi_app/lib/models/orm/__init__.py b/src/fastapi_app/lib/models/orm/__init__.py new file mode 100644 index 0000000..f01a3d8 --- /dev/null +++ b/src/fastapi_app/lib/models/orm/__init__.py @@ -0,0 +1,4 @@ +from .base import Base, IdCreatedUpdatedBaseMixin +from .joke import JokeORM + +__all__ = ["Base", "IdCreatedUpdatedBaseMixin", "JokeORM"] diff --git a/src/fastapi_app/lib/models/orm/base.py b/src/fastapi_app/lib/models/orm/base.py new file mode 100644 index 0000000..3d1ace3 --- /dev/null +++ b/src/fastapi_app/lib/models/orm/base.py @@ -0,0 +1,35 @@ +import datetime +import uuid + +import sqlalchemy +import sqlalchemy.dialects.postgresql +import sqlalchemy.ext.declarative +import sqlalchemy.orm as sa_orm +import sqlalchemy.sql as sa_sql + + +class Base(sa_orm.DeclarativeBase): + """Base class for all models.""" + + @sqlalchemy.ext.declarative.declared_attr.directive + def __tablename__(cls): + return cls.__name__.lower() + + __mapper_args__ = {"eager_defaults": True} + + id: sa_orm.Mapped[uuid.UUID] = sa_orm.mapped_column(primary_key=True, default=uuid.uuid4) + + +class IdCreatedUpdatedBaseMixin: + # id: sa_orm.Mapped[int] = sa_orm.mapped_column(primary_key=True) + # id_field: sa_orm.Mapped[uuid.UUID] = sa_orm.mapped_column(name="uuid", primary_key=True, unique=True, default=uuid.uuid4, nullable=False) + created: sa_orm.Mapped[datetime.datetime] = sa_orm.mapped_column(server_default=sa_sql.func.now()) + updated: sa_orm.Mapped[datetime.datetime] = sa_orm.mapped_column( + server_default=sa_sql.func.now(), onupdate=sa_sql.func.now() + ) + + # __mapper_args__ = {"eager_defaults": True} + + # @sqlalchemy.ext.declarative.declared_attr.directive + # def __tablename__(cls) -> str: + # return cls.__name__.lower() diff --git a/src/fastapi_app/lib/models/orm/joke.py b/src/fastapi_app/lib/models/orm/joke.py new file mode 100644 index 0000000..38aa64d --- /dev/null +++ b/src/fastapi_app/lib/models/orm/joke.py @@ -0,0 +1,13 @@ +import sqlalchemy.orm as sa_orm + +import lib.models.orm.base as base + +Base = base.Base + + +class JokeORM(Base): + __tablename__ = "joke" # type: ignore + + type_field: sa_orm.Mapped[str] = sa_orm.mapped_column(name="type", nullable=False) + setup: sa_orm.Mapped[str] = sa_orm.mapped_column() + punchline: sa_orm.Mapped[str] = sa_orm.mapped_column()