umbau 1.0
This commit is contained in:
29
app/db.py
29
app/db.py
@ -30,6 +30,19 @@ async def init_db() -> None:
|
||||
await _connection.execute("PRAGMA journal_mode = WAL;")
|
||||
await _connection.execute("PRAGMA foreign_keys = ON;")
|
||||
await _connection.execute("PRAGMA busy_timeout = 5000;")
|
||||
# E5 (Umsetzungsauftrag Teil E): ohne explizites PRAGMA synchronous
|
||||
# verwendet SQLite seinen kompilierten Standard FULL -- das fsynct bei
|
||||
# JEDEM COMMIT, unabhaengig vom (an sich korrekten) WAL-Journal-Modus.
|
||||
# aiosqlite bedient alle Anfragen ueber EINEN gemeinsamen Hintergrund-
|
||||
# Thread (die einzige Verbindung der Anwendung, siehe E.0/E5-Befund) --
|
||||
# ein fsync dort serialisiert sich vor JEDE andere wartende Anfrage
|
||||
# jedes anderen Benutzers. NORMAL ist die von SQLite fuer WAL-Betrieb
|
||||
# dokumentierte Empfehlung: fsynct nur noch an Checkpoint-Grenzen,
|
||||
# bleibt dabei garantiert unbeschaedigt bei einem Anwendungsabsturz
|
||||
# (der hier relevante Fall) -- nur bei einem Stromausfall/OS-Crash
|
||||
# koennen die letzten, unmittelbar davor committeten Transaktionen
|
||||
# verloren gehen (nicht: die DB korrumpieren).
|
||||
await _connection.execute("PRAGMA synchronous = NORMAL;")
|
||||
await _apply_migrations(_connection)
|
||||
|
||||
try:
|
||||
@ -51,6 +64,22 @@ async def _apply_migrations(conn: aiosqlite.Connection) -> None:
|
||||
logger.info("Wende Migration an: %s", migration_file.name)
|
||||
sql = migration_file.read_text(encoding="utf-8")
|
||||
await conn.executescript(sql)
|
||||
|
||||
# Fremdschluesselpruefung NACH jeder Migration: PRAGMA foreign_key_check
|
||||
# liefert nur eine Ergebnismenge zurueck, die ein per executescript()
|
||||
# ausgefuehrtes Skript NICHT auswertet (das PRAGMA innerhalb des
|
||||
# Skripts selbst ist daher wirkungslos) -- deshalb wird es hier,
|
||||
# ausserhalb von executescript(), explizit erneut ausgefuehrt und
|
||||
# das Ergebnis geprueft. Verletzungen brechen den Start hart ab,
|
||||
# statt eine inkonsistente Datenbank stillschweigend zu uebernehmen
|
||||
# (siehe 0014_drop_tenants.sql-Kommentar).
|
||||
violations = await (await conn.execute("PRAGMA foreign_key_check")).fetchall()
|
||||
if violations:
|
||||
raise RuntimeError(
|
||||
f"Migration {migration_file.name} hat Fremdschluessel-Verletzungen "
|
||||
f"hinterlassen, Start abgebrochen: {violations!r}"
|
||||
)
|
||||
|
||||
await conn.execute(
|
||||
"INSERT INTO schema_migrations (filename) VALUES (?)", (migration_file.name,)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user