from sqlalchemy import Column, Integer, Text, String, Float, DateTime, ForeignKey, func from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, Mapped from typing import List, Optional # 基础模型基类(如果已有全局 Base 可直接复用) ResourceBase = declarative_base() class U3C3(ResourceBase): """对应 sqlite 中的 u3c3 表""" __tablename__ = "u3c3" # 表名与原表保持一致 # 字段定义(严格映射原表结构) id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID") sites = Column(Text, comment="站点名称") category = Column(Text, comment="分类") title = Column(Text, comment="标题") # 关键修改:给 String 加长度(如 512,根据实际链接长度调整) url = Column(String(512), unique=True, comment="资源链接(唯一)") torrent_url = Column(Text, comment="种子链接") magnet_url = Column(Text, comment="磁力链接") size_text = Column(Text, comment="大小文本描述") size_gb = Column(Float, comment="大小(GB)") update_date = Column(Text, comment="更新日期") # 补充:MySQL 中建议用 func.now() 替代 func.datetime(...),兼容性更好 created_at = Column(DateTime, default=func.now(), comment="创建时间(本地时间)") updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="更新时间(本地时间)") def __repr__(self): """打印实例时显示的信息""" return f"" class Sis(ResourceBase): """对应 MySQL 中的 sis 表""" __tablename__ = "sis" # 表名与原表保持一致 # 字段定义(严格映射原表结构) id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID") plate_name = Column(Text, comment="板块名称") title = Column(Text, comment="标题") url = Column(String(512), unique=True, comment="资源链接(唯一)") size_text = Column(Text, comment="大小文本描述") size_gb = Column(Float, comment="大小(GB)") update_date = Column(Text, comment="更新日期") # 补充:MySQL 中建议用 func.now() 替代 func.datetime(...),兼容性更好 created_at = Column(DateTime, default=func.now(), comment="创建时间(本地时间)") updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="更新时间(本地时间)") def __repr__(self): return f"" class ClmIndex(ResourceBase): """对应 MySQL 中的 clm_index 表""" __tablename__ = "clm_index" # 表名与原表保持一致 # 字段定义(严格映射原表结构) id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID") category = Column(Text, comment="分类") title = Column(Text, comment="标题") href = Column(String(512), unique=True, comment="资源链接(唯一)") magnet_href = Column(Text, comment="磁力链接") size_text = Column(Text, comment="大小文本描述") size_gb = Column(Float, comment="大小(GB)") heat = Column(Integer, default=0, comment="热度") add_date = Column(Text, comment="添加日期") last_down_date = Column(Text, comment="最后下载日期") created_at = Column(DateTime, default=func.now(), comment="创建时间(本地时间)") updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="更新时间(本地时间)") # 关系定义:用 Mapped[List["ClmKeywordsIndex"]] 替代 List["ClmKeywordsIndex"] clm_keywords_index: Mapped[List["ClmKeywordsIndex"]] = relationship( "ClmKeywordsIndex", back_populates="index" ) def __repr__(self): return f"" class ClmKeywords(ResourceBase): """对应 MySQL 中的 clm_keywords 表""" __tablename__ = "clm_keywords" # 表名与原表保持一致 # 字段定义(严格映射原表结构) id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID") words = Column(String(512), unique=True, comment="关键词(唯一)") groups = Column(Text, comment="关键词分组") tags = Column(Text, comment="标签") index_count = Column(Integer, default=0, comment="关联索引数量") created_at = Column(DateTime, default=func.now(), comment="创建时间(本地时间)") updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="更新时间(本地时间)") # 关系定义:用 Mapped[List["ClmKeywordsIndex"]] 替代 List["ClmKeywordsIndex"] clm_keywords_index: Mapped[List["ClmKeywordsIndex"]] = relationship( "ClmKeywordsIndex", back_populates="words" ) def __repr__(self): return f"" class ClmKeywordsIndex(ResourceBase): """对应 MySQL 中的 clm_keywords_index 表(关联表)""" __tablename__ = "clm_keywords_index" # 表名与原表保持一致 # 字段定义(严格映射原表结构) id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID") words_id = Column(Integer, ForeignKey("clm_keywords.id"), comment="关键词ID(外键)") index_id = Column(Integer, ForeignKey("clm_index.id"), comment="索引ID(外键)") wid_iid = Column(String(255), unique=True, comment="关键词与索引的关联标识") tags = Column(Text, comment="关联标签") created_at = Column(DateTime, default=func.now(), comment="创建时间(本地时间)") updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="更新时间(本地时间)") # 关系定义:用 Mapped 包装单个对象类型 index: Mapped["ClmIndex"] = relationship("ClmIndex", back_populates="clm_keywords_index") words: Mapped["ClmKeywords"] = relationship("ClmKeywords", back_populates="clm_keywords_index") def __repr__(self): return f""