"""Hochgeladene Dateien; jede liegt als eigene DuckDB-Datei mit einer Tabelle vor (→ Konzept 7.7).""" from datetime import datetime from typing import Any from sqlalchemy import JSON, BigInteger, ForeignKey, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base, now FORMATS = {".csv": "csv", ".tsv": "csv", ".json": "json", ".jsonl": "json", ".ndjson": "json", ".parquet": "parquet"} class Upload(Base): __tablename__ = "uploads" __table_args__ = (UniqueConstraint("workspace_id", "table_name"),) id: Mapped[int] = mapped_column(primary_key=True) workspace_id: Mapped[int] = mapped_column(ForeignKey("workspaces.id", ondelete="CASCADE"), index=True) filename: Mapped[str] = mapped_column(String(255)) # Originalname, nur zur Anzeige table_name: Mapped[str] = mapped_column(String(63)) # Name der Tabelle für SQL format: Mapped[str] = mapped_column(String(20)) size: Mapped[int] = mapped_column(BigInteger) # hochgeladene Datei stored_size: Mapped[int] = mapped_column(BigInteger, default=0, server_default="0") # DuckDB-Datei, zählt fürs Kontingent status: Mapped[str] = mapped_column(String(20), default="new") # new | ok | error error: Mapped[str] = mapped_column(Text, default="") # [{"name": ..., "type": ...}] columns: Mapped[list[dict[str, Any]]] = mapped_column(JSON, default=list) row_count: Mapped[int] = mapped_column(BigInteger, default=0) uploaded_by: Mapped[int] = mapped_column(ForeignKey("users.id")) created: Mapped[datetime] = mapped_column(default=now)