d3069d423b
- CRUD 新增 get_by_names_and_level() 批量查分类 - CRUD 新增 get_active_by_categories() 批量查素材 - CRUD 新增 increment_usage_count_batch() 批量更新 usage_count - 重写 batch_match:从 N 次 DB 往返降到 3 次(查分类 + 查素材 + UPDATE) - Redis 改用 pipeline 批量 sadd + expire - 解决并发/连接池不足导致的间歇性 500 错误
50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
"""
|
|
素材分类 CRUD
|
|
==============
|
|
"""
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.crud.base import CRUDBase
|
|
from app.models.broll_category import BrollCategory
|
|
|
|
|
|
class BrollCategoryCRUD(CRUDBase[BrollCategory]):
|
|
"""素材分类数据访问"""
|
|
|
|
def __init__(self) -> None:
|
|
super().__init__(BrollCategory)
|
|
|
|
async def get_by_name_and_level(
|
|
self, db: AsyncSession, *, name: str, level: int
|
|
) -> BrollCategory | None:
|
|
"""根据名称和层级获取启用的分类"""
|
|
result = await db.execute(
|
|
select(BrollCategory).where(
|
|
BrollCategory.name == name,
|
|
BrollCategory.level == level,
|
|
BrollCategory.status == "active",
|
|
)
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def get_by_names_and_level(
|
|
self, db: AsyncSession, *, names: list[str], level: int
|
|
) -> list[BrollCategory]:
|
|
"""批量根据名称和层级获取启用的分类"""
|
|
if not names:
|
|
return []
|
|
result = await db.execute(
|
|
select(BrollCategory).where(
|
|
BrollCategory.name.in_(names),
|
|
BrollCategory.level == level,
|
|
BrollCategory.status == "active",
|
|
)
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
|
|
# 导出实例
|
|
broll_category = BrollCategoryCRUD()
|