docuflow / backend /database.py
Joedroid's picture
Resolve all security vulnerabilities, bug fixes, and print watermarking configurations based on product review
7dfd4d1
Raw
History Blame Contribute Delete
1.47 kB
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
# 1. Retrieve the Database connection string
DATABASE_URL = os.getenv("DATABASE_URL")
# Fallback to local SQLite if DATABASE_URL is not set or starts with sqlite
if not DATABASE_URL or DATABASE_URL.startswith("sqlite"):
if not DATABASE_URL:
DATABASE_URL = "sqlite:///./local_docuflow.db"
# sqlite requires connect_args for multithreading
connect_args = {"check_same_thread": False}
engine_args = {}
else:
# Normalize legacy postgres:// URIs to postgresql:// for SQLAlchemy compatibility
if DATABASE_URL.startswith("postgres://"):
DATABASE_URL = DATABASE_URL.replace("postgres://", "postgresql://", 1)
# Enforce SSL/TLS for PostgreSQL connection (sslmode=require)
connect_args = {"sslmode": "require"}
# Set connection pooling options for database robustness
engine_args = {
"pool_size": 10,
"max_overflow": 20,
"pool_pre_ping": True,
"pool_recycle": 1800,
}
# 2. Initialize Engine & Session
engine = create_engine(DATABASE_URL, connect_args=connect_args, **engine_args)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 3. Base class for SQLAlchemy Models
Base = declarative_base()
# 4. Dependency to get DB session in FastAPI routes
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()