/ backend / database.py
database.py
 1  """
 2  Database connection setup using SQLAlchemy with async support.
 3  """
 4  from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
 5  from sqlalchemy.orm import DeclarativeBase
 6  from config import settings
 7  
 8  
 9  # Create async engine
10  # Note: asyncpg uses postgresql+asyncpg:// instead of postgresql://
11  database_url = settings.database_url.replace("postgresql://", "postgresql+asyncpg://")
12  
13  engine = create_async_engine(
14      database_url,
15      echo=True,  # Set to False in production - logs all SQL queries
16      future=True
17  )
18  
19  # Session factory
20  AsyncSessionLocal = async_sessionmaker(
21      engine,
22      class_=AsyncSession,
23      expire_on_commit=False
24  )
25  
26  
27  # Base class for all models
28  class Base(DeclarativeBase):
29      pass
30  
31  
32  # Dependency to get database session
33  async def get_db() -> AsyncSession:
34      """
35      Dependency that provides a database session.
36      
37      Usage in route:
38          @router.get("/example")
39          async def example(db: AsyncSession = Depends(get_db)):
40              # use db here
41      """
42      async with AsyncSessionLocal() as session:
43          try:
44              yield session
45              await session.commit()
46          except Exception:
47              await session.rollback()
48              raise
49          finally:
50              await session.close()
51