bifroest/app/uploads/models.py
2026-10-27 08:34:17 +01:00

32 lines
1.6 KiB
Python

"""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)