Spaces:
Runtime error
Runtime error
File size: 1,785 Bytes
d4fbcf5 8d7ad2e 310323c 8d7ad2e d4fbcf5 109e9fa d4fbcf5 | 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 | 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) |