diff --git a/src/proxy_pool/db/base.py b/src/proxy_pool/db/base.py new file mode 100644 index 0000000..7a72cff --- /dev/null +++ b/src/proxy_pool/db/base.py @@ -0,0 +1,22 @@ +import uuid +from datetime import datetime + +from sqlalchemy import func +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column + + +class Base(DeclarativeBase): + pass + + +class UUIDPrimaryKeyMixin: + id: Mapped[uuid.UUID] = mapped_column( + primary_key=True, + default_factory=uuid.uuid4, + ) + + +class TimestampMixin: + created_at: Mapped[datetime] = mapped_column( + server_default=func.now(), + ) diff --git a/src/proxy_pool/db/session.py b/src/proxy_pool/db/session.py new file mode 100644 index 0000000..3109a3f --- /dev/null +++ b/src/proxy_pool/db/session.py @@ -0,0 +1,21 @@ +from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine + +from proxy_pool.config import Settings + + +def create_engine(settings: Settings): + return create_async_engine( + settings.database_url, + pool_size=settings.db_pool_size, + max_overflow=settings.db_max_overflow, + echo=settings.log_level == "DEBUG", + ) + + +def create_session_factory(settings: Settings) -> async_sessionmaker[AsyncSession]: + engine = create_engine(settings) + return async_sessionmaker( + engine, + class_=AsyncSession, + expire_on_commit=False, + )