Files
MemoryBear/app/repositories/memory_increment_repository.py
2025-11-30 18:22:17 +08:00

110 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from sqlalchemy import func
from sqlalchemy.orm import Session, aliased
from typing import List, Optional
import uuid
import datetime
from app.models.memory_increment_model import MemoryIncrement
from app.core.logging_config import get_db_logger
# 获取数据库专用日志器
db_logger = get_db_logger()
class MemoryIncrementRepository:
def __init__(self, db: Session):
self.db = db
def get_memory_increments_by_workspace_id(self, workspace_id: uuid.UUID, limit: int) -> List[MemoryIncrement]:
"""根据工作空间ID查询内存增量通过 MemoryIncrement 关联查询 MemoryIncrement 列表"""
try:
# 使用窗口函数按日期分区并排序
subquery = (
self.db.query(
MemoryIncrement,
func.row_number().over(
partition_by=func.date(MemoryIncrement.created_at), # 按日期分区
order_by=MemoryIncrement.created_at.desc() # 按时间戳升序排序
).label('row_num')
)
.filter(MemoryIncrement.workspace_id == workspace_id)
.subquery()
)
memory_increment_alias = aliased(MemoryIncrement, subquery)
memory_increments = (
self.db.query(memory_increment_alias)
.filter(subquery.c.row_num == 1) # 只取每个日期的第一条(最新的)
.order_by(memory_increment_alias.created_at.asc()) # 按时间戳降序排序
.limit(limit)
.all()
)
db_logger.info(f"成功查询工作空间 {workspace_id} 下的内存增量")
return memory_increments
except Exception as e:
db_logger.error(f"查询工作空间 {workspace_id} 下内存增量时出错: {str(e)}")
raise
def get_latest_memory_increment_by_workspace_id(self, workspace_id: uuid.UUID) -> Optional[MemoryIncrement]:
"""根据工作空间ID查询最新的内存增量记录"""
try:
memory_increment = (
self.db.query(MemoryIncrement)
.filter(MemoryIncrement.workspace_id == workspace_id)
.order_by(MemoryIncrement.created_at.desc(), MemoryIncrement.id.desc())
.first()
)
if memory_increment:
db_logger.info(f"成功查询工作空间 {workspace_id} 下的最新内存增量")
else:
db_logger.warning(f"未找到工作空间 {workspace_id} 下的内存增量记录")
return memory_increment
except Exception as e:
db_logger.error(f"查询工作空间 {workspace_id} 下最新内存增量时出错: {str(e)}")
raise
def write_memory_increment(
self,
workspace_id: uuid.UUID,
total_num: int
) -> MemoryIncrement:
"""写入内存增量"""
try:
memory_increment = MemoryIncrement(
workspace_id=workspace_id,
total_num=total_num,
created_at=datetime.datetime.now(),
updated_at=datetime.datetime.now()
)
self.db.add(memory_increment)
self.db.commit()
self.db.refresh(memory_increment)
db_logger.info(f"成功写入内存增量: workspace_id={workspace_id}, total_num={total_num}")
return memory_increment
except Exception as e:
db_logger.error(f"写入内存增量失败: workspace_id={workspace_id}, total_num={total_num} - {str(e)}")
raise
def get_memory_increments_by_workspace_id(db: Session, workspace_id: uuid.UUID, limit: int) -> List[MemoryIncrement]:
"""根据工作空间ID查询内存增量返回 MemoryIncrement ORM 列表)"""
repo = MemoryIncrementRepository(db)
memory_increments = repo.get_memory_increments_by_workspace_id(workspace_id, limit)
return memory_increments
def write_memory_increment(
db: Session,
workspace_id: uuid.UUID,
total_num: int
) -> MemoryIncrement:
"""写入内存增量"""
repo = MemoryIncrementRepository(db)
memory_increment = repo.write_memory_increment(workspace_id, total_num)
return memory_increment
def get_latest_memory_increment_by_workspace_id(db: Session, workspace_id: uuid.UUID) -> Optional[MemoryIncrement]:
"""根据工作空间ID查询最新的内存增量记录"""
repo = MemoryIncrementRepository(db)
return repo.get_latest_memory_increment_by_workspace_id(workspace_id)