68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
"""
|
|
ⒸAngelaMos | 2025
|
|
Base SQLModel class with async PostgreSQL engine setup
|
|
"""
|
|
|
|
from datetime import UTC, datetime
|
|
from collections.abc import AsyncGenerator
|
|
|
|
from sqlalchemy import DateTime
|
|
from sqlalchemy.ext.asyncio import (
|
|
AsyncSession,
|
|
create_async_engine,
|
|
)
|
|
from sqlmodel import Field, SQLModel
|
|
from sqlalchemy.orm import sessionmaker
|
|
|
|
from app.config import settings
|
|
|
|
|
|
class BaseDBModel(SQLModel):
|
|
"""
|
|
Base model with common timestamp fields
|
|
"""
|
|
created_at: datetime = Field(
|
|
default_factory = lambda: datetime.now(UTC),
|
|
nullable = False,
|
|
sa_type = DateTime(timezone = True),
|
|
)
|
|
updated_at: datetime = Field(
|
|
default_factory = lambda: datetime.now(UTC),
|
|
nullable = False,
|
|
sa_type = DateTime(timezone = True),
|
|
sa_column_kwargs = {"onupdate": lambda: datetime.now(UTC)},
|
|
)
|
|
|
|
|
|
# Create async engine for PostgreSQL
|
|
engine = create_async_engine(
|
|
str(settings.DATABASE_URL),
|
|
echo = settings.DEBUG,
|
|
pool_size = settings.DB_POOL_SIZE,
|
|
max_overflow = settings.DB_MAX_OVERFLOW,
|
|
pool_pre_ping = True,
|
|
)
|
|
|
|
# Create async session factory
|
|
async_session_maker = sessionmaker( # type: ignore[call-overload]
|
|
bind = engine,
|
|
class_ = AsyncSession,
|
|
expire_on_commit = False,
|
|
)
|
|
|
|
|
|
async def get_session() -> AsyncGenerator[AsyncSession]:
|
|
"""
|
|
Dependency for getting database sessions
|
|
"""
|
|
async with async_session_maker() as session:
|
|
yield session
|
|
|
|
|
|
async def init_db() -> None:
|
|
"""
|
|
Initialize database tables
|
|
"""
|
|
async with engine.begin() as conn:
|
|
await conn.run_sync(SQLModel.metadata.create_all)
|