From bbfd8ddab0a1c1a7e0609ad97dc107cf3ec9fa48 Mon Sep 17 00:00:00 2001 From: Pine Date: Sun, 13 Sep 2026 12:44:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(compute):=20=E4=BF=AE=E5=A4=8D=E5=9B=BE?= =?UTF-8?q?=E6=A0=87/=E7=B3=BB=E5=88=97=E6=8E=A5=E5=8F=A3=20AsyncSession?= =?UTF-8?q?=20=E6=9C=AA=20await=20=E5=AF=BC=E8=87=B4=E7=9A=84=20500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - list_icons/list_series 等 20 处 db.session.execute/get/commit 补 await - series_to_dict/icon_to_dict 的图标 URL 统一 resolve_url 补全(兼容相对路径) - 全局核查:其余 execute 均为 sqlite 同步连接,无同类问题 --- app/api/routers/rbac_compute_assets.py | 46 +++++++++++++------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/app/api/routers/rbac_compute_assets.py b/app/api/routers/rbac_compute_assets.py index 84a3b30..2dd5bad 100644 --- a/app/api/routers/rbac_compute_assets.py +++ b/app/api/routers/rbac_compute_assets.py @@ -48,7 +48,7 @@ def series_to_dict(s: ComputeSeries) -> dict: "name": s.name, "display_name": s.display_name, "supplier": s.supplier, - "icon": s.icon, + "icon": resolve_url(s.icon or s.icon_file), "icon_file": s.icon_file, "description": s.description, "sort_order": s.sort_order, @@ -119,8 +119,8 @@ async def list_series( stmt = stmt.where(and_(*conditions)) stmt = stmt.order_by(ComputeSeries.sort_order.asc(), ComputeSeries.created_at.desc()) - total = len(list(db.session.execute(stmt).scalars())) - items = list(db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size)).scalars()) + total = len(list((await db.session.execute(stmt)).scalars())) + items = list((await db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size))).scalars()) return { "items": [series_to_dict(s) for s in items], "total": total, @@ -141,7 +141,7 @@ async def series_options( if status: stmt = stmt.where(ComputeSeries.status == status) stmt = stmt.order_by(ComputeSeries.sort_order.asc(), ComputeSeries.name.asc()) - items = list(db.session.execute(stmt).scalars()) + items = list((await db.session.execute(stmt)).scalars()) return { "items": [ { @@ -163,7 +163,7 @@ async def get_series( user: dict = Depends(get_current_user), ): check_role(user, ["operator", "park_admin", "enterprise_admin"]) - s = db.session.get(ComputeSeries, series_id) + s = await db.session.get(ComputeSeries, series_id) if not s: raise HTTPException(status_code=404, detail="系列不存在") return series_to_dict(s) @@ -177,9 +177,9 @@ async def create_series( ): check_role(user, ["operator", "park_admin"]) # 检查名称唯一性 - existing = db.session.execute( + existing = (await db.session.execute( select(ComputeSeries).where(ComputeSeries.name == body.name) - ).scalar_one_or_none() + )).scalar_one_or_none() if existing: raise HTTPException(status_code=400, detail=f"系列名称「{body.name}」已存在") @@ -198,7 +198,7 @@ async def create_series( updated_at=now, ) db.session.add(s) - db.session.commit() + await db.session.commit() await write_audit(db, user, "create_compute_series", f"创建系列 {body.name}") return series_to_dict(s) @@ -211,16 +211,16 @@ async def update_series( user: dict = Depends(get_current_user), ): check_role(user, ["operator", "park_admin"]) - s = db.session.get(ComputeSeries, series_id) + s = await db.session.get(ComputeSeries, series_id) if not s: raise HTTPException(status_code=404, detail="系列不存在") # 检查名称唯一性(排除自身) if body.name != s.name: - existing = db.session.execute( + existing = (await db.session.execute( select(ComputeSeries).where( and_(ComputeSeries.name == body.name, ComputeSeries.id != series_id) ) - ).scalar_one_or_none() + )).scalar_one_or_none() if existing: raise HTTPException(status_code=400, detail=f"系列名称「{body.name}」已存在") @@ -233,7 +233,7 @@ async def update_series( s.sort_order = body.sort_order s.status = body.status s.updated_at = now_str() - db.session.commit() + await db.session.commit() await write_audit(db, user, "update_compute_series", f"更新系列 {body.name}") return series_to_dict(s) @@ -245,12 +245,12 @@ async def delete_series( user: dict = Depends(get_current_user), ): check_role(user, ["operator", "park_admin"]) - s = db.session.get(ComputeSeries, series_id) + s = await db.session.get(ComputeSeries, series_id) if not s: raise HTTPException(status_code=404, detail="系列不存在") name = s.name db.session.delete(s) - db.session.commit() + await db.session.commit() await write_audit(db, user, "delete_compute_series", f"删除系列 {name}") return {"ok": True, "message": f"已删除系列 {name}"} @@ -301,8 +301,8 @@ async def list_icons( stmt = stmt.where(and_(*conditions)) stmt = stmt.order_by(ComputeIcon.created_at.desc()) - total = len(list(db.session.execute(stmt).scalars())) - items = list(db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size)).scalars()) + total = len(list((await db.session.execute(stmt)).scalars())) + items = list((await db.session.execute(stmt.offset((page - 1) * page_size).limit(page_size))).scalars()) return { "items": [icon_to_dict(i) for i in items], "total": total, @@ -332,7 +332,7 @@ async def icon_options( if conditions: stmt = stmt.where(and_(*conditions)) stmt = stmt.order_by(ComputeIcon.name.asc()) - items = list(db.session.execute(stmt).scalars()) + items = list((await db.session.execute(stmt)).scalars()) return { "items": [ { @@ -353,7 +353,7 @@ async def get_icon( user: dict = Depends(get_current_user), ): check_role(user, ["operator", "park_admin", "enterprise_admin"]) - i = db.session.get(ComputeIcon, icon_id) + i = await db.session.get(ComputeIcon, icon_id) if not i: raise HTTPException(status_code=404, detail="图标不存在") return icon_to_dict(i) @@ -384,7 +384,7 @@ async def create_icon( updated_at=now, ) db.session.add(i) - db.session.commit() + await db.session.commit() await write_audit(db, user, "create_compute_icon", f"创建图标 {body.name}") return icon_to_dict(i) @@ -397,7 +397,7 @@ async def update_icon( user: dict = Depends(get_current_user), ): check_role(user, ["operator", "park_admin"]) - i = db.session.get(ComputeIcon, icon_id) + i = await db.session.get(ComputeIcon, icon_id) if not i: raise HTTPException(status_code=404, detail="图标不存在") i.name = body.name @@ -411,7 +411,7 @@ async def update_icon( i.description = body.description i.status = body.status i.updated_at = now_str() - db.session.commit() + await db.session.commit() await write_audit(db, user, "update_compute_icon", f"更新图标 {body.name}") return icon_to_dict(i) @@ -423,11 +423,11 @@ async def delete_icon( user: dict = Depends(get_current_user), ): check_role(user, ["operator", "park_admin"]) - i = db.session.get(ComputeIcon, icon_id) + i = await db.session.get(ComputeIcon, icon_id) if not i: raise HTTPException(status_code=404, detail="图标不存在") name = i.name db.session.delete(i) - db.session.commit() + await db.session.commit() await write_audit(db, user, "delete_compute_icon", f"删除图标 {name}") return {"ok": True, "message": f"已删除图标 {name}"}