Spaces:
Runtime error
Runtime error
| 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) |