| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, BigInteger
- from sqlalchemy.orm import relationship
- from sqlalchemy.sql import func
- from ulid import ULID
- from app.database import Base
- def generate_ulid() -> str:
- """Generate a new ULID string."""
- return str(ULID())
- class Project(Base):
- __tablename__ = "projects"
- id = Column(String(26), primary_key=True, default=generate_ulid)
- project_name = Column(String(100), unique=True, nullable=False, index=True)
- description = Column(Text, nullable=True)
- created_at = Column(DateTime(timezone=True), server_default=func.now())
- versions = relationship("DataVersion", back_populates="project")
- class DataVersion(Base):
- __tablename__ = "data_versions"
- id = Column(String(26), primary_key=True, default=generate_ulid)
- project_id = Column(String(26), ForeignKey("projects.id"))
- stage = Column(String(50), nullable=False)
- commit_id = Column(String(64), nullable=False)
- author = Column(String(50))
- manifest_snapshot = Column(Text)
- created_at = Column(DateTime(timezone=True), server_default=func.now())
- project = relationship("Project", back_populates="versions")
- files = relationship("DataFile", back_populates="version")
- class DataFile(Base):
- __tablename__ = "data_files"
- id = Column(Integer, primary_key=True, index=True, autoincrement=True)
- version_id = Column(String(26), ForeignKey("data_versions.id"))
- relative_path = Column(String(255))
- storage_path = Column(String(500))
- file_size = Column(BigInteger)
- file_type = Column(String(20))
- file_sha = Column(String(64), index=True) # Git Blob SHA for deduplication
- created_at = Column(DateTime(timezone=True), server_default=func.now())
- version = relationship("DataVersion", back_populates="files")
|