File size: 1,630 Bytes
08af9fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from sqlmodel import create_engine, Session
from typing import Generator
import os
from contextlib import contextmanager

from dotenv import load_dotenv

from dotenv import load_dotenv
from pathlib import Path

# File is at: E:\Hackathon_02\backend\src\database\database.py
# We want: E:\Hackathon_02\backend\.env
# Solution: Go up 3 levels to reach 'backend'
# Professional Database Connection for TODOAI Engine
# Ensure both Frontend (Next.js/Better-Auth) and Backend (FastAPI) use the same NEON cloud instance
DATABASE_URL = os.getenv("DATABASE_URL") or "postgresql://neondb_owner:npg_O1mLbVXkfEY5@ep-broad-fog-a4ba5mi3-pooler.us-east-1.aws.neon.tech/neondb?sslmode=require"

# Create the database engine
# Use connect_args={"check_same_thread": False} for SQLite to allow multiple threads
if DATABASE_URL.startswith("sqlite"):
    engine = create_engine(DATABASE_URL, echo=True, connect_args={"check_same_thread": False})
else:
    # For PostgreSQL, use pooling options to handle connection timeouts from serverless dbs like Neon
    engine = create_engine(
        DATABASE_URL, 
        echo=True,
        pool_pre_ping=True,
        pool_recycle=300
    )


def get_session() -> Generator[Session, None, None]:
    """
    Get a database session for dependency injection.
    """
    with Session(engine) as session:
        yield session


@contextmanager
def get_db_session():
    """
    Context manager for database sessions.
    """
    session = Session(engine)
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()