From 8a8ea7ec09754dd42e31762d6b0b9cfe8ad9f9db Mon Sep 17 00:00:00 2001 From: Daniil Fajnberg Date: Fri, 1 Jul 2022 17:17:52 +0200 Subject: [PATCH] Make use of more SQLAlchemy Utils --- requirements/common.txt | 1 + setup.cfg | 1 + src/compub/db/base.py | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/requirements/common.txt b/requirements/common.txt index 4deb891..5a06d14 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -3,4 +3,5 @@ FastAPI SQLAlchemy[asyncio] Alembic SQLAlchemy-Utils +Babel python-slugify \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 7c4c265..eb46a7c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,6 +28,7 @@ install_requires = SQLAlchemy[asyncio] Alembic SQLAlchemy-Utils + Babel python-slugify [options.extras_require] diff --git a/src/compub/db/base.py b/src/compub/db/base.py index 906b7e5..d2cb273 100644 --- a/src/compub/db/base.py +++ b/src/compub/db/base.py @@ -3,6 +3,8 @@ from sqlalchemy.orm import declarative_base, sessionmaker from sqlalchemy.sql.functions import now as db_now from sqlalchemy.sql.schema import Column from sqlalchemy.sql.sqltypes import TIMESTAMP +from sqlalchemy_utils.functions.orm import get_columns +from sqlalchemy_utils.listeners import force_auto_coercion from compub.exceptions import NoDatabaseConfigured from compub.settings import settings @@ -14,6 +16,8 @@ engine = create_async_engine(settings.db_uri, future=True) LocalAsyncSession = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession) ORMBase = declarative_base() +force_auto_coercion() + class AbstractBase(ORMBase): __abstract__ = True @@ -25,7 +29,7 @@ class AbstractBase(ORMBase): def __repr__(self) -> str: # Exclude non-representative fields: - fields = (name for name in self.__mapper__.columns.keys() if name not in self.NON_REPR_FIELDS) + fields = (name for name in get_columns(self).keys() if name not in self.NON_REPR_FIELDS) # Exclude NULL value fields: attrs = ', '.join(f"{name}={repr(getattr(self, name))}" for name in fields if getattr(self, name) is not None) return f"{self.__class__.__name__}({attrs})"