Datumsspalten auf Date-Typ umgestellt und Normalisierungsmigration
Modelle: startdatum (Projekt), datum und wiedervorlage_datum (CallLog) von String(20) auf Date umgestellt. columns2dict serialisiert diese nun über isoformat() als yyyy-MM-dd. Die String-Normalisierung in columns2dict wurde entfernt, da sie nicht mehr benötigt wird. Migration V01.08: Normalisiert bestehende String-Datumswerte (z.B. '2026-08-3') auf ISO-Format yyyy-MM-dd mittels printf/substr, da SQLite's date() einstellige Komponenten nicht erkennt. Leere Strings werden zu NULL. V01.07 ist Platzhalter für die fehlgeschlagene V01.06. Client: toDateInputValue normalisiert ebenfalls String-Datumswerte als Fallback für Route-Params (Neuanlage). Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
1 parent
93827dde0f
commit
461953a7e9
3 files changed
+108
-6
No files matched your search
@@ -108,6 +108,98 @@ def _db_V01_05():
|
||||
session.commit()
|
||||
|
||||
|
||||
def _db_V01_07():
|
||||
"""
|
||||
Platzhalter für die fehlgeschlagene Migration V01.06. Die eigentliche
|
||||
Normalisierung erfolgt in V01.08, da V01.06 bereits (fehlerhaft)
|
||||
durchlief und die Systeminfo auf 01.06 aktualisierte.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
def _db_V01_08():
|
||||
"""
|
||||
Normalisiert bestehende Datumswerte in den Spalten 'datum' und
|
||||
'wiedervorlage_datum' (call_logs) sowie 'startdatum' (projekte) auf
|
||||
das ISO-Format yyyy-MM-dd. Diese Spalten waren bisher String-Spalten
|
||||
und können Werte ohne führende Nullen (z.B. '2026-08-3') enthalten,
|
||||
die von SQLite's date()-Funktion nicht erkannt werden. Daher wird
|
||||
printf('%04d-%02d-%02d', ...) zur Normalisierung verwendet, das auch
|
||||
einstellige Monate/Tage korrekt auffüllt. Leere Strings werden zu
|
||||
NULL konvertiert, da der Date-Typ keine leeren Strings akzeptiert.
|
||||
|
||||
Alle Updates werden vor dem Update der Systeminfo committet, um
|
||||
'database is locked' zu vermeiden.
|
||||
"""
|
||||
from sqlalchemy import text
|
||||
|
||||
# Normalisierungs-Ausdruck: splittet den Datum-String am '-' und
|
||||
# formatiert die Komponenten mit führenden Nullen.
|
||||
# _norm(col) = printf('%04d-%02d-%02d',
|
||||
# cast(substr(col, 1, instr(col, '-')-1) as integer),
|
||||
# cast(substr(col, instr(col, '-')+1, instr(substr(col, instr(col, '-')+1), '-')-1) as integer),
|
||||
# cast(substr(col, instr(col, '-')+instr(substr(col, instr(col, '-')+1), '-')+1) as integer)
|
||||
# )
|
||||
# Da dieser Ausdruck sehr lang ist, wird er pro Spalte inline gesetzt.
|
||||
|
||||
# call_logs.datum
|
||||
session.execute(text(
|
||||
"UPDATE call_logs SET datum = "
|
||||
"printf('%04d-%02d-%02d', "
|
||||
" cast(substr(datum, 1, instr(datum, '-')-1) as integer), "
|
||||
" cast(substr(datum, instr(datum, '-')+1, "
|
||||
" instr(substr(datum, instr(datum, '-')+1), '-')-1) as integer), "
|
||||
" cast(substr(datum, "
|
||||
" instr(datum, '-')+instr(substr(datum, instr(datum, '-')+1), '-')+1"
|
||||
" ) as integer)) "
|
||||
"WHERE datum IS NOT NULL AND datum != '' "
|
||||
"AND instr(datum, '-') > 0"
|
||||
))
|
||||
session.execute(text(
|
||||
"UPDATE call_logs SET datum = NULL WHERE datum = ''"
|
||||
))
|
||||
|
||||
# call_logs.wiedervorlage_datum
|
||||
session.execute(text(
|
||||
"UPDATE call_logs SET wiedervorlage_datum = "
|
||||
"printf('%04d-%02d-%02d', "
|
||||
" cast(substr(wiedervorlage_datum, 1, instr(wiedervorlage_datum, '-')-1) as integer), "
|
||||
" cast(substr(wiedervorlage_datum, instr(wiedervorlage_datum, '-')+1, "
|
||||
" instr(substr(wiedervorlage_datum, instr(wiedervorlage_datum, '-')+1), '-')-1) as integer), "
|
||||
" cast(substr(wiedervorlage_datum, "
|
||||
" instr(wiedervorlage_datum, '-')+instr(substr(wiedervorlage_datum, instr(wiedervorlage_datum, '-')+1), '-')+1"
|
||||
" ) as integer)) "
|
||||
"WHERE wiedervorlage_datum IS NOT NULL AND wiedervorlage_datum != '' "
|
||||
"AND instr(wiedervorlage_datum, '-') > 0"
|
||||
))
|
||||
session.execute(text(
|
||||
"UPDATE call_logs SET wiedervorlage_datum = NULL WHERE wiedervorlage_datum = ''"
|
||||
))
|
||||
|
||||
# projekte.startdatum
|
||||
session.execute(text(
|
||||
"UPDATE projekte SET startdatum = "
|
||||
"printf('%04d-%02d-%02d', "
|
||||
" cast(substr(startdatum, 1, instr(startdatum, '-')-1) as integer), "
|
||||
" cast(substr(startdatum, instr(startdatum, '-')+1, "
|
||||
" instr(substr(startdatum, instr(startdatum, '-')+1), '-')-1) as integer), "
|
||||
" cast(substr(startdatum, "
|
||||
" instr(startdatum, '-')+instr(substr(startdatum, instr(startdatum, '-')+1), '-')+1"
|
||||
" ) as integer)) "
|
||||
"WHERE startdatum IS NOT NULL AND startdatum != '' "
|
||||
"AND instr(startdatum, '-') > 0"
|
||||
))
|
||||
session.execute(text(
|
||||
"UPDATE projekte SET startdatum = NULL WHERE startdatum = ''"
|
||||
))
|
||||
|
||||
# Daten-Updates committen, bevor die Systeminfo aktualisiert wird.
|
||||
session.commit()
|
||||
# Systeminfo erst nach dem Commit der Daten-Updates aktualisieren.
|
||||
_updatesysteminfo('01.08')
|
||||
session.commit()
|
||||
|
||||
|
||||
def checkupdates():
|
||||
"""
|
||||
Ermittelt die aktuelle DB-Version aus der Systeminfo-Tabelle und führt alle
|
||||
|
||||
Reference in new issue
Block a user