From 57af1c7db160f3232872f8c994e3e1ba29a478c3 Mon Sep 17 00:00:00 2001 From: stefanfeng Date: Thu, 6 Aug 2026 17:52:01 +0800 Subject: [PATCH] fix: gracefully handle missing avatar SQLite database - Return empty list instead of crashing when avatar.db doesn't exist - Add is_available() check before each endpoint - 503 status when trying to access unavailable database --- backend/app/api/endpoints/avatars.py | 8 +++++++- backend/app/services/avatar_service.py | 11 +++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/app/api/endpoints/avatars.py b/backend/app/api/endpoints/avatars.py index 3196e74..bb38988 100644 --- a/backend/app/api/endpoints/avatars.py +++ b/backend/app/api/endpoints/avatars.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Query, HTTPException from app.schemas import ApiResponse -from app.services.avatar_service import avatar_service, get_session +from app.services.avatar_service import avatar_service, get_session, is_available router = APIRouter() @@ -15,6 +15,8 @@ def list_avatars( status: str = Query(default=None), ): """分页查询所有数字分身""" + if not is_available(): + return ApiResponse(data={"total": 0, "page": page, "page_size": page_size, "items": []}) db = get_session() try: total, items = avatar_service.list_avatars( @@ -35,6 +37,8 @@ def list_avatars( @router.get("/{avatar_id}") def get_avatar(avatar_id: str): """获取单个数字分身详情""" + if not is_available(): + raise HTTPException(status_code=503, detail="数字分身数据库尚未初始化") db = get_session() try: data = avatar_service.get_avatar(db, avatar_id) @@ -54,6 +58,8 @@ def update_avatar_status(avatar_id: str, body: dict): status_code=400, detail="status 必须是 active、inactive 或 training", ) + if not is_available(): + raise HTTPException(status_code=503, detail="数字分身数据库尚未初始化") db = get_session() try: data = avatar_service.update_status(db, avatar_id, status) diff --git a/backend/app/services/avatar_service.py b/backend/app/services/avatar_service.py index 90d1fd4..4faec7f 100644 --- a/backend/app/services/avatar_service.py +++ b/backend/app/services/avatar_service.py @@ -23,7 +23,8 @@ def _get_engine_and_session(): if not os.path.isabs(db_path): db_path = os.path.abspath(db_path) if not os.path.exists(db_path): - raise FileNotFoundError(f"数字分身数据库不存在: {db_path}") + # 数据库不存在时返回 None,由调用方处理 + return None, None _engine = create_engine( f"sqlite:///{db_path}", connect_args={"check_same_thread": False}, @@ -32,11 +33,17 @@ def _get_engine_and_session(): return _engine, _SessionLocal() -def get_session() -> Session: +def get_session() -> Optional[Session]: _, session = _get_engine_and_session() return session +def is_available() -> bool: + """检查数字分身数据库是否可用""" + engine, _ = _get_engine_and_session() + return engine is not None + + class AvatarService: @staticmethod