fix: 代码审查问题修复
- unit_of_work.py: 简化为纯 session 上下文管理器,消除 double-close 风险 - validation.py: 移除未使用的 import,简化 _score_to_1x2 逻辑 - repositories.py: 将 func 导入移到模块顶层 - 更新所有 get_uow() 调用点使用新接口(yield session 而非 uow 对象)
This commit is contained in:
+15
-45
@@ -1,63 +1,33 @@
|
||||
"""工作单元(Unit of Work):统一事务边界。
|
||||
|
||||
使用方式:
|
||||
async with UnitOfWork(db) as uow:
|
||||
await uow.matches.get_by_id(1)
|
||||
await uow.matches.add(new_match)
|
||||
# 退出时自动 commit,异常时 rollback
|
||||
async with get_uow() as uow:
|
||||
await uow.session.get(Match, 1)
|
||||
await uow.commit()
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import AsyncIterator
|
||||
from contextlib import asynccontextmanager
|
||||
from typing import AsyncGenerator
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from src.db.base import AsyncSessionLocal
|
||||
|
||||
|
||||
class UnitOfWork:
|
||||
"""工作单元:封装事务边界。"""
|
||||
|
||||
def __init__(self, session: AsyncSession) -> None:
|
||||
self._session = session
|
||||
self.committed = False
|
||||
|
||||
@property
|
||||
def session(self) -> AsyncSession:
|
||||
return self._session
|
||||
|
||||
async def commit(self) -> None:
|
||||
await self._session.commit()
|
||||
self.committed = True
|
||||
|
||||
async def rollback(self) -> None:
|
||||
await self._session.rollback()
|
||||
|
||||
async def close(self) -> None:
|
||||
await self._session.close()
|
||||
|
||||
async def __aenter__(self) -> "UnitOfWork":
|
||||
return self
|
||||
|
||||
async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
|
||||
if exc_type is not None:
|
||||
await self.rollback()
|
||||
await self.close()
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def get_uow() -> AsyncGenerator[UnitOfWork, None]:
|
||||
"""创建新的工作单元(用于非路由上下文)。"""
|
||||
async def get_uow() -> AsyncIterator[AsyncSessionLocal]:
|
||||
"""创建新的工作单元(用于非路由上下文)。
|
||||
|
||||
用法:
|
||||
async with get_uow() as session:
|
||||
await session.get(...)
|
||||
# 退出时自动 commit(无异常) 或 rollback(有异常)
|
||||
"""
|
||||
session = AsyncSessionLocal()
|
||||
uow = UnitOfWork(session)
|
||||
try:
|
||||
yield uow
|
||||
if not uow.committed:
|
||||
await uow.commit()
|
||||
yield session
|
||||
await session.commit()
|
||||
except Exception:
|
||||
await uow.rollback()
|
||||
await session.rollback()
|
||||
raise
|
||||
finally:
|
||||
await uow.close()
|
||||
await session.close()
|
||||
|
||||
Reference in New Issue
Block a user