File size: 2,421 Bytes
51d74bd
dbba9a3
 
 
51d74bd
dbba9a3
 
 
e58c6b6
51d74bd
 
e58c6b6
dbba9a3
e58c6b6
51d74bd
dbba9a3
 
 
 
 
 
 
 
5645b6d
 
 
e58c6b6
dbba9a3
 
 
 
 
 
 
 
 
e58c6b6
dbba9a3
e58c6b6
dbba9a3
e58c6b6
 
5645b6d
 
dbba9a3
51d74bd
dbba9a3
5645b6d
e58c6b6
dbba9a3
 
5645b6d
 
dbba9a3
e58c6b6
dbba9a3
51d74bd
 
dbba9a3
 
 
e58c6b6
51d74bd
dbba9a3
 
51d74bd
 
 
 
 
 
 
 
dbba9a3
 
 
 
51d74bd
dbba9a3
 
51d74bd
 
 
dbba9a3
 
 
 
 
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.exc import OperationalError

# ==========================================================
# DATABASE URL
# ==========================================================
DATABASE_URL = os.getenv("DATABASE_URL")

if not DATABASE_URL:
    raise RuntimeError(
        "DATABASE_URL environment variable is not set"
    )

# ==========================================================
# SUPABASE ENTERPRISE ENGINE CONFIG
# ==========================================================
# Optimized for:
# - Supabase Pooler
# - FastAPI async workload
# - Background workers
# - Long-running autonomous services

engine = create_engine(
    DATABASE_URL,

    # --- Pool Stability ---
    pool_pre_ping=True,      # validates dead connections
    pool_recycle=300,        # refresh connections
    pool_size=5,             # safe baseline
    max_overflow=10,         # burst capacity

    # --- Reliability ---
    echo=False,
    future=True,

    # --- Supabase Requirement ---
    connect_args={
        "sslmode": "require",
        "connect_timeout": 10,
    },
)

# ==========================================================
# SESSION FACTORY
# ==========================================================
SessionLocal = sessionmaker(
    autocommit=False,
    autoflush=False,
    bind=engine,
)

# ==========================================================
# BASE MODEL
# ==========================================================
Base = declarative_base()

# ==========================================================
# DEPENDENCY (FASTAPI)
# ==========================================================
def get_db():
    """
    FastAPI dependency injection session.
    Ensures connection cleanup even on crash.
    """
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


# ==========================================================
# CONNECTION TEST (STARTUP SAFE)
# ==========================================================
def verify_database_connection():
    """
    Validates database connectivity during startup.
    Prevents silent runtime failures.
    """
    try:
        with engine.connect() as conn:
            conn.execute("SELECT 1")
    except OperationalError as e:
        raise RuntimeError(
            f"Database connection failed: {str(e)}"
        )