from sqlalchemy import Column, Integer, Float, String, DateTime, Boolean, JSON, ForeignKey, Enum as SQLEnum from enum import Enum from sqlalchemy import Enum as SQLAlchemyEnum from sqlalchemy.orm import relationship, backref from datetime import datetime from sqlalchemy.ext.declarative import declarative_base from database import Base class AnalysisStatus(str, Enum): PENDING = "pending" # 분석 대기 중 PROCESSING = "processing" # 분석 진행 중 COMPARING = "comparing" # 분석 결과 비교 중 COMPLETED = "completed" # 분석 완료 FAILED = "failed" # 분석 실패 class Music_Analysis(Base): # Music 간 분석 관계를 나타내는 테이블 __tablename__ = "music_analysis" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) user = relationship("User", back_populates="music_analysis") music1_id = Column(Integer, ForeignKey("musics.id"), nullable=False) # 첫 번째 Music music2_id = Column(Integer, ForeignKey("musics.id"), nullable=False) # 두 번째 Music analysis_results = relationship("Analysis_Result", back_populates="music_analysis", cascade="all, delete-orphan") compare_results = relationship("Compare_Result", back_populates="music_analysis", cascade="all, delete-orphan") music1 = relationship("Music", foreign_keys=[music1_id]) # 관계 정의 music2 = relationship("Music", foreign_keys=[music2_id]) # 관계 정의 requested_at = Column(DateTime, default=datetime.utcnow) # 요청 시간 status = Column(SQLAlchemyEnum(AnalysisStatus), default=AnalysisStatus.COMPLETED) progress = Column(Float, default=0.0) # 1대1 분석 진행률. 야매로 넣습니다 deleted = Column(Boolean, default=False) # 삭제 여부 def __repr__(self): return f"" @property def user_name(self): return self.user.user_info.name if self.user and self.user.user_info else None @property def music1_title(self): return self.music1.title if self.music1 else None @property def music2_title(self): return self.music2.title if self.music2 else None def __repr__(self): return f"" class Analysis_Result(Base): __tablename__ = "analysis_results" id = Column(Integer, primary_key=True, index=True) analysis_id = Column(Integer, ForeignKey("music_analysis.id"), nullable=False) # Music_Analysis와의 외래 키 관계 music_analysis = relationship("Music_Analysis", back_populates="analysis_results") requested_at = Column(DateTime, default=datetime.utcnow) # 요청 시간 music1_json_path = Column(String) # 첫 번째 Music JSON 파일 경로 music2_json_path = Column(String) # 두 번째 Music JSON 파일 경로 def __repr__(self): return f"" class Compare_Result(Base): __tablename__ = "compare_results" id = Column(Integer, primary_key=True, index=True) analysis_id = Column(Integer, ForeignKey("music_analysis.id"), nullable=False) # Music_Analysis와의 외래 키 관계 music_analysis = relationship("Music_Analysis", back_populates="compare_results") # 여기를 수정 requested_at = Column(DateTime, default=datetime.utcnow) # 요청 시간 compare_result_path = Column(String) # 분석 결과 파일 경로 def __repr__(self): return f""