File size: 1,623 Bytes
58de15f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# app/db/database.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import logging

# Import settings to get the database URL
from app.core.config import settings

logger = logging.getLogger(__name__)

# Ensure the DATABASE_URL (which is PostgresDsn type) is converted to string for create_engine
SQLALCHEMY_DATABASE_URL = str(settings.DATABASE_URL)

logger.info(f"Database URL Prefix: {SQLALCHEMY_DATABASE_URL[:SQLALCHEMY_DATABASE_URL.find('@') if '@' in SQLALCHEMY_DATABASE_URL else 20]}...") # Log prefix only, hiding credentials

try:
    # Create the SQLAlchemy engine
    # pool_pre_ping=True helps handle potential connection drops
    engine = create_engine(
        SQLALCHEMY_DATABASE_URL,
        pool_pre_ping=True
        # Add connect_args if needed, e.g., for SQLite:
        # connect_args={"check_same_thread": False}
    )

    # Create a configured "Session" class
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

    # Create a Base class for declarative class definitions
    Base = declarative_base()

    logger.info("SQLAlchemy engine and SessionLocal created successfully.")

except Exception as e:
    logger.exception(f"Failed to create SQLAlchemy engine or SessionLocal: {e}")
    # Depending on requirements, might want to raise error to prevent startup
    raise RuntimeError("Database configuration failed.") from e


# Dependency function to get a DB session for API endpoints
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()