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)