8 KiB
Detaillierte Analyse: Datenbankstruktur vs. Pydantic-Modelle
Export-Datum: 2026-01-19T20:12:28.176720Z
Export-Quelle: Production Instance
Zusammenfassung
Von 19 Tabellen haben alle ein entsprechendes Pydantic-Modell, aber es wurden Unterschiede gefunden. Die meisten Unterschiede sind erwartbar (z.B. ID-Felder mit default_factory sind im Modell optional, aber in der DB NOT NULL), aber es gibt einige wichtige Inkonsistenzen, die behoben werden sollten.
Kritische Unterschiede (müssen behoben werden)
1. UserInDB (datamodelUam.py)
Felder nur in DB (fehlen im Modell):
privilege(text, nullable)- Problem: Feld existiert in der Datenbank, aber nicht im Pydantic-Modell
- Empfehlung: Entweder Feld zum Modell hinzufügen oder aus der DB entfernen
Typ-Mismatches:
-
roleLabels- DB:
jsonb(dict) - nullable - Modell:
List[str]- optional - Problem: Datenbank speichert JSONB (wird als dict interpretiert), Modell erwartet Liste von Strings
- Empfehlung: Prüfen, wie die Daten tatsächlich gespeichert werden. Wenn es eine Liste ist, sollte der Typ in der DB korrekt sein. Wenn es ein dict ist, sollte das Modell angepasst werden.
- DB:
-
resetTokenExpires- DB:
text- nullable - Modell:
float(UTC timestamp in seconds) - optional - Problem: Datenbank speichert als Text, Modell erwartet Float (Unix-Timestamp)
- Empfehlung: DB-Typ sollte
double precision(float8) sein, nichttext
- DB:
2. ChatLog (datamodelChat.py)
Felder nur im Modell (fehlen in DB):
actionNumber(Optional[int])roundNumber(Optional[int])taskNumber(Optional[int])- Problem: Diese Felder sind im Modell definiert, aber nicht in der Datenbank vorhanden
- Empfehlung: Entweder Migration erstellen, um diese Spalten hinzuzufügen, oder aus dem Modell entfernen
Typ-Mismatches:
-
progress- DB:
text- nullable - Modell:
float(0.0 to 1.0) - optional - Problem: Datenbank speichert als Text, Modell erwartet Float
- Empfehlung: DB-Typ sollte
double precision(float8) sein
- DB:
-
performance- DB:
text- nullable - Modell:
Dict[str, Any]- optional - Problem: Datenbank speichert als Text, Modell erwartet Dictionary (JSON)
- Empfehlung: DB-Typ sollte
jsonbsein
- DB:
3. Token (datamodelSecurity.py)
Typ-Mismatches:
-
userId- DB:
text- nullable - Modell:
str- required (nicht optional) - Problem: Datenbank erlaubt NULL, Modell erwartet zwingend einen Wert
- Empfehlung: DB sollte
NOT NULLsein, da es ein required Feld ist
- DB:
-
authority- DB:
text- nullable - Modell:
AuthAuthority(Enum) - required - Problem: Datenbank erlaubt NULL, Modell erwartet zwingend einen Wert
- Empfehlung: DB sollte
NOT NULLsein
- DB:
-
tokenAccess- DB:
text- nullable - Modell:
str- required - Problem: Datenbank erlaubt NULL, Modell erwartet zwingend einen Wert
- Empfehlung: DB sollte
NOT NULLsein
- DB:
-
createdAt- DB:
text- nullable - Modell:
float(UTC timestamp) - optional - Problem: Datenbank speichert als Text, Modell erwartet Float
- Empfehlung: DB-Typ sollte
double precision(float8) sein
- DB:
-
revokedAt- DB:
text- nullable - Modell:
float(UTC timestamp) - optional - Problem: Datenbank speichert als Text, Modell erwartet Float
- Empfehlung: DB-Typ sollte
double precision(float8) sein
- DB:
4. UserConnection (datamodelUam.py)
Typ-Mismatches:
-
expiresAt- DB:
text- nullable - Modell:
float(UTC timestamp) - optional - Problem: Datenbank speichert als Text, Modell erwartet Float
- Empfehlung: DB-Typ sollte
double precision(float8) sein
- DB:
-
tokenExpiresAt- DB:
text- nullable - Modell:
float(UTC timestamp) - optional - Problem: Datenbank speichert als Text, Modell erwartet Float
- Empfehlung: DB-Typ sollte
double precision(float8) sein
- DB:
5. ChatWorkflow (datamodelChat.py)
Typ-Mismatches (JSONB vs. List):
Mehrere Felder haben das Problem, dass die DB jsonb (als dict interpretiert) speichert, aber das Modell List[...] erwartet:
logs: DB=jsonb(dict), Modell=List[ChatLog]messages: DB=jsonb(dict), Modell=List[ChatMessage]stats: DB=jsonb(dict), Modell=List[ChatStat]tasks: DB=jsonb(dict), Modell=List[...]expectedFormats: DB=text, Modell=List[...]
Problem: JSONB-Felder werden als Dictionary interpretiert, aber das Modell erwartet Listen. Dies deutet darauf hin, dass die Daten möglicherweise als Arrays im JSONB gespeichert werden sollten, oder dass die Serialisierung/Deserialisierung angepasst werden muss.
Empfehlung: Prüfen, wie diese Daten tatsächlich gespeichert und geladen werden. Möglicherweise benötigt die Anwendung eine Custom Serialisierung für JSONB-Arrays.
Erwartbare Unterschiede (keine Aktion erforderlich)
ID-Felder mit default_factory
Viele Tabellen haben ID-Felder, die im Modell als optional=True markiert sind (wegen default_factory=lambda: str(uuid.uuid4())), aber in der DB als NOT NULL definiert sind. Dies ist erwartbar und korrekt, da:
- Pydantic-Felder mit
default_factorysind technisch optional (können beim Erstellen weggelassen werden) - Die Datenbank erwartet jedoch immer einen Wert (NOT NULL)
Betroffene Tabellen: AccessRule, AuthEvent, DataNeutraliserConfig, DataNeutralizerAttributes, Mandate, Role, ChatDocument, FileData, FileItem, Prompt
Weitere Typ-Mismatches (möglicherweise erwartbar)
Role.description
- DB:
jsonb(dict) - nullable - Modell:
str- optional - Hinweis: Möglicherweise wird hier ein mehrsprachiges Dictionary gespeichert, während das Modell einen String erwartet. Prüfen, ob eine Custom Serialisierung verwendet wird.
ActionItem.expectedDocumentFormats
- DB:
jsonb(dict) - nullable - Modell:
List[...]- optional - Hinweis: Ähnlich wie bei ChatWorkflow - JSONB vs. List
AutomationDefinition.executionLogs
- DB:
jsonb(dict) - nullable - Modell:
List[...]- optional - Hinweis: Ähnlich wie bei ChatWorkflow - JSONB vs. List
ChatMessage.documents
- DB:
jsonb(dict) - nullable - Modell:
List[...]- optional - Hinweis: Ähnlich wie bei ChatWorkflow - JSONB vs. List
Empfohlene Maßnahmen
Priorität 1 (Kritisch - Datenintegrität):
- UserInDB.privilege: Feld hinzufügen oder entfernen
- ChatLog:
actionNumber,roundNumber,taskNumberhinzufügen oder aus Modell entfernen - Token: Required-Felder (
userId,authority,tokenAccess) solltenNOT NULLin DB sein - Timestamp-Felder: Alle Timestamp-Felder sollten
double precisionsein, nichttext
Priorität 2 (Wichtig - Typ-Konsistenz):
- JSONB vs. List: Prüfen und korrigieren der Serialisierung für alle JSONB-Felder, die Listen enthalten sollen
- UserInDB.roleLabels: Prüfen, ob es wirklich eine Liste oder ein Dictionary ist
Priorität 3 (Optional - Code-Qualität):
- ID-Felder: Optional können die Modelle angepasst werden, um explizit
NOT NULLzu reflektieren (aber nicht notwendig)
Technische Details
Typ-Mapping-Probleme
Das Vergleichstool mappt PostgreSQL-Typen wie folgt:
character varying/varchar/text→strboolean/bool→boolinteger/int/bigint→intdouble precision/float8→floatjsonb/json→dict
Problem: JSONB kann sowohl Dictionaries als auch Arrays enthalten. Das Tool interpretiert JSONB immer als dict, auch wenn es tatsächlich ein Array ist. Dies führt zu falschen Mismatch-Meldungen bei Listen-Feldern.
Lösung: Für eine genauere Analyse müsste das Tool die tatsächlichen JSONB-Werte prüfen oder die Datenbank-Schema-Definitionen genauer analysieren.