Files
meijiaka-zy/python-api/app/crud/broll_category.py
T
小鱼开发 d3069d423b perf(material): batch_match 批量查询优化,减少 DB 往返
- 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 错误
2026-05-16 14:48:28 +08:00

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()