absa-tourism-api / database.py
CrossManger's picture
Update database.py
310323c verified
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)