mickeywu520's picture
first commit
cd9bca9
"""
資料庫連線管理
"""
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()