Files
xdl/backend/app/models.py
mini b5c50b0779 fix: cascade delete download_logs when video is deleted
DownloadLog has ondelete=CASCADE on FK but ORM relationship lacked
cascade='all, delete-orphan', causing IntegrityError (NOT NULL) on
video deletion.
2026-02-19 01:00:51 +08:00

59 lines
2.4 KiB
Python

"""SQLAlchemy models."""
from datetime import datetime
from sqlalchemy import Column, Integer, String, DateTime, BigInteger, Text, Index, ForeignKey
from sqlalchemy.orm import relationship
from app.database import Base
class Video(Base):
__tablename__ = "videos"
id = Column(Integer, primary_key=True, autoincrement=True)
task_id = Column(String(64), unique=True, index=True, nullable=False)
url = Column(String(512), nullable=False, index=True)
title = Column(String(512), default="")
platform = Column(String(32), default="")
thumbnail = Column(String(1024), default="")
quality = Column(String(32), default="")
format_id = Column(String(64), default="")
filename = Column(String(512), default="")
file_path = Column(String(1024), default="")
file_size = Column(BigInteger, default=0)
duration = Column(Integer, default=0)
status = Column(String(16), default="pending") # pending, downloading, done, error
error_message = Column(Text, default="")
progress = Column(Integer, default=0) # 0-100
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
__table_args__ = (
Index("ix_video_url_format_id", "url", "format_id"),
)
logs = relationship("DownloadLog", back_populates="video", lazy="select", cascade="all, delete-orphan")
class DownloadLog(Base):
__tablename__ = "download_logs"
id = Column(Integer, primary_key=True, autoincrement=True)
video_id = Column(Integer, ForeignKey("videos.id", ondelete="CASCADE"), nullable=False, index=True)
ip = Column(String(64), default="")
user_agent = Column(Text, default="")
browser = Column(String(64), default="") # Chrome / Firefox / Safari / Edge / …
device = Column(String(32), default="") # desktop / mobile / tablet / bot
country_code = Column(String(8), default="") # e.g. CN
country = Column(String(128), default="") # e.g. China
city = Column(String(128), default="") # e.g. Shanghai
downloaded_at = Column(DateTime, default=datetime.utcnow, index=True)
video = relationship("Video", back_populates="logs")
class AppSetting(Base):
__tablename__ = "app_settings"
key = Column(String(64), primary_key=True)
value = Column(Text, default="")
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)