32 lines
1.6 KiB
Python
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)
|