from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, DeclarativeBase, Session from typing import Generator import os from dotenv import load_dotenv # 1. Xác định chính xác vị trí thư mục backend/ CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) env_path = os.path.join(CURRENT_DIR, ".env") # 2. Ép nạp biến môi trường từ ĐÚNG tệp .env đó load_dotenv(dotenv_path=env_path) # 3. Lấy biến từ môi trường DATABASE_URL = os.getenv("DATABASE_URL") # 4. Chốt chặn an toàn if not DATABASE_URL: raise ValueError("⛔ CẢNH BÁO: Không tìm thấy DATABASE_URL. Hãy kiểm tra lại file .env hoặc biến môi trường trên server deploy!") # 3. Tạo engine thuần túy cho PostgreSQL (hoặc MySQL) # Chú ý: Đã xóa hoàn toàn logic của SQLite engine = create_engine( DATABASE_URL, pool_pre_ping=True, # Tự động kiểm tra kết nối trước khi gửi query pool_recycle=300, # Làm mới kết nối sau mỗi 5 phút để tránh bị Supabase ngắt pool_size=3, # Số lượng kết nối tối thiểu max_overflow=0 # Không tạo thêm kết nối dư thừa (tiết kiệm tài nguyên Free tier) ) SessionLocal = sessionmaker( bind=engine, autocommit=False, autoflush=False, ) class Base(DeclarativeBase): pass def get_db() -> Generator[Session, None, None]: """FastAPI dependency that provides a database session per request.""" db = SessionLocal() try: yield db finally: db.close() def init_db() -> None: """Create all tables defined via Base metadata.""" import models # noqa: F401 — ensure models are registered Base.metadata.create_all(bind=engine)