models.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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 ulid import ULID
  5. from app.database import Base
  6. def generate_ulid() -> str:
  7. """Generate a new ULID string."""
  8. return str(ULID())
  9. class Project(Base):
  10. __tablename__ = "projects"
  11. id = Column(String(26), primary_key=True, default=generate_ulid)
  12. project_name = Column(String(100), unique=True, nullable=False, index=True)
  13. description = Column(Text, nullable=True)
  14. created_at = Column(DateTime(timezone=True), server_default=func.now())
  15. versions = relationship("DataVersion", back_populates="project")
  16. class DataVersion(Base):
  17. __tablename__ = "data_versions"
  18. id = Column(String(26), primary_key=True, default=generate_ulid)
  19. project_id = Column(String(26), ForeignKey("projects.id"))
  20. stage = Column(String(50), nullable=False)
  21. commit_id = Column(String(64), nullable=False)
  22. author = Column(String(50))
  23. manifest_snapshot = Column(Text)
  24. created_at = Column(DateTime(timezone=True), server_default=func.now())
  25. project = relationship("Project", back_populates="versions")
  26. files = relationship("DataFile", back_populates="version")
  27. class DataFile(Base):
  28. __tablename__ = "data_files"
  29. id = Column(Integer, primary_key=True, index=True, autoincrement=True)
  30. version_id = Column(String(26), ForeignKey("data_versions.id"))
  31. relative_path = Column(String(255))
  32. storage_path = Column(String(500))
  33. file_size = Column(BigInteger)
  34. file_type = Column(String(20))
  35. file_sha = Column(String(64), index=True) # Git Blob SHA for deduplication
  36. created_at = Column(DateTime(timezone=True), server_default=func.now())
  37. version = relationship("DataVersion", back_populates="files")