models.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, BigInteger
  2. from sqlalchemy.orm import relationship
  3. from sqlalchemy.sql import func
  4. from app.database import Base
  5. class Project(Base):
  6. __tablename__ = "projects"
  7. id = Column(Integer, primary_key=True, index=True)
  8. project_name = Column(String(100), unique=True, nullable=False, index=True)
  9. description = Column(Text, nullable=True)
  10. created_at = Column(DateTime(timezone=True), server_default=func.now())
  11. versions = relationship("DataVersion", back_populates="project")
  12. class DataVersion(Base):
  13. __tablename__ = "data_versions"
  14. id = Column(Integer, primary_key=True, index=True)
  15. project_id = Column(Integer, ForeignKey("projects.id"))
  16. stage = Column(String(50), nullable=False)
  17. commit_id = Column(String(64), nullable=False)
  18. author = Column(String(50))
  19. manifest_snapshot = Column(Text)
  20. created_at = Column(DateTime(timezone=True), server_default=func.now())
  21. project = relationship("Project", back_populates="versions")
  22. files = relationship("DataFile", back_populates="version")
  23. class DataFile(Base):
  24. __tablename__ = "data_files"
  25. id = Column(Integer, primary_key=True, index=True)
  26. version_id = Column(Integer, ForeignKey("data_versions.id"))
  27. relative_path = Column(String(255))
  28. storage_path = Column(String(500))
  29. file_size = Column(BigInteger)
  30. file_type = Column(String(20))
  31. file_sha = Column(String(64), index=True) # Git Blob SHA for deduplication
  32. created_at = Column(DateTime(timezone=True), server_default=func.now())
  33. version = relationship("DataVersion", back_populates="files")