""" 搜索功能数据ORM定义 定义搜索功能相关的数据库表结构,包含用户搜索偏好和使用记录 """ from datetime import datetime from sqlalchemy import ( Column, Integer, String, Boolean, DateTime, Numeric, ForeignKey, Index, CheckConstraint, BigInteger, JSON ) from sqlalchemy.sql import func from sqlalchemy.orm import relationship from app.database import Base class UserSearchPreferences(Base): """ 用户搜索偏好ORM类 存储用户的默认搜索配置,包括搜索策略、时效性等偏好设置 """ __tablename__ = "user_search_preferences" # 主键 id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID") # 用户ID(外键关联users表,级联删除) user_id = Column( String(50), ForeignKey("aigcspace.users.id", ondelete="CASCADE"), nullable=False, unique=True, comment="用户ID" ) # 默认搜索策略 default_search_strategy = Column( String(10), nullable=False, default='turbo', comment="默认搜索策略:turbo/max/agent" ) # 是否启用垂域搜索 enable_search_extension = Column( Boolean, nullable=False, default=False, comment="是否启用垂域搜索" ) # 默认搜索时效性(天) default_freshness = Column( Integer, nullable=True, comment="默认搜索时效性(天):7/30/180/365" ) # 是否启用引用标注 enable_citation = Column( Boolean, nullable=False, default=False, comment="是否启用引用标注" ) # 引用格式 citation_format = Column( String(20), nullable=False, default='[]', comment="引用格式:[] 或 [ref_]" ) # 创建时间 created_at = Column( DateTime, nullable=False, server_default=func.now(), comment="创建时间" ) # 更新时间 updated_at = Column( DateTime, nullable=False, server_default=func.now(), onupdate=func.now(), comment="更新时间" ) # 表级配置 __table_args__ = ( Index('idx_user_search_preferences_user_id', 'user_id'), CheckConstraint( "default_search_strategy IN ('turbo', 'max', 'agent')", name='chk_search_strategy' ), CheckConstraint( "default_freshness IS NULL OR default_freshness IN (7, 30, 180, 365)", name='chk_freshness' ), CheckConstraint( "citation_format IN ('[]', '[ref_]')", name='chk_citation_format' ), {'schema': 'aigcspace', 'comment': '用户搜索偏好表,存储用户的默认搜索配置'} ) def __repr__(self): return f"" class SearchUsageLog(Base): """ 搜索使用记录ORM类 记录用户的搜索使用情况,用于统计分析和计费管理 """ __tablename__ = "search_usage_log" # 主键 id = Column(BigInteger, primary_key=True, autoincrement=True, comment="主键ID") # 用户ID(外键关联users表,级联删除) user_id = Column( String(50), ForeignKey("aigcspace.users.id", ondelete="CASCADE"), nullable=False, comment="用户ID" ) # 会话ID(外键关联ai_conversation表,允许为空) conversation_id = Column( Integer, ForeignKey("aigcspace.ai_conversation.id", ondelete="SET NULL"), nullable=True, comment="会话ID" ) # 使用的模型名称 model_name = Column( String(255), nullable=False, comment="使用的模型名称" ) # 搜索策略 search_strategy = Column( String(10), nullable=False, comment="搜索策略:turbo/max/agent" ) # 搜索次数 search_count = Column( Integer, nullable=False, default=1, comment="搜索次数" ) # 搜索成本 search_cost = Column( Numeric(10, 4), nullable=False, default=0.0000, comment="搜索成本" ) # 创建时间 created_at = Column( DateTime, nullable=False, server_default=func.now(), comment="创建时间" ) # 表级配置 __table_args__ = ( Index('idx_search_usage_log_user_id', 'user_id'), Index('idx_search_usage_log_conversation_id', 'conversation_id'), Index('idx_search_usage_log_user_created', 'user_id', 'created_at'), Index('idx_search_usage_log_created_at', 'created_at'), Index('idx_search_usage_log_model_name', 'model_name'), CheckConstraint( "search_strategy IN ('turbo', 'max', 'agent')", name='chk_search_usage_strategy' ), CheckConstraint( "search_count > 0", name='chk_search_count' ), CheckConstraint( "search_cost >= 0", name='chk_search_cost' ), {'schema': 'aigcspace', 'comment': '搜索使用记录表,用于统计和计费'} ) def __repr__(self): return f""