File size: 1,547 Bytes
cd9bca9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
53
54
55
56
57
58
59
"""
資料庫連線管理
"""

from sqlalchemy import create_engine, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from backend.config import settings
import logging

logger = logging.getLogger(__name__)

# SQLAlchemy 設定
engine = create_engine(
    settings.DATABASE_URL,
    echo=settings.DEBUG,  # 在 DEBUG 模式下顯示 SQL 語句
    pool_size=10,
    max_overflow=20,
    pool_pre_ping=True,  # 連線前檢查
    pool_recycle=3600,   # 1小時後回收連線
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

def get_database_session() -> Session:
    """取得資料庫 session"""
    db = SessionLocal()
    try:
        return db
    except Exception as e:
        db.close()
        raise e

def close_database_session(db: Session):
    """關閉資料庫 session"""
    try:
        db.close()
    except Exception as e:
        logger.error(f"關閉資料庫 session 時發生錯誤: {str(e)}")

def test_database_connection() -> bool:
    """測試資料庫連線"""
    try:
        with engine.connect() as connection:
            result = connection.execute(text("SELECT 1"))
            return result.fetchone()[0] == 1
    except Exception as e:
        logger.error(f"資料庫連線測試失敗: {str(e)}")
        return False

# 依賴注入函數,用於 FastAPI
def get_db():
    """FastAPI 依賴注入函數"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()