python / expert
Snippet
Multi-Datenbank-Abfrage-Routing mit benutzerdefinierten Fehlerbehandlungs-Hooks
Django Query-Router ermöglichen das dynamische Anpassen der Multi-Datenbankauswahl anhand von Hints. Das Auslösen strukturierter Fehler beim Fehlen von Kontextmetadaten verhindert ungewollte Lesezugriffe auf Standard-Datenbanken.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TenantDatabaseRouter:"""Routes read/write operations and manages fallback errors."""def db_for_read(self, model, **hints):tenant = hints.get("tenant_id")if not tenant:raise KeyError("Missing tenant_id hint in query routing context")return f"tenant_{tenant}"def db_for_write(self, model, **hints):return self.db_for_read(model, **hints)def allow_relation(self, obj1, obj2, **hints):return obj1._state.db == obj2._state.dbdef allow_migrate(self, db, app_label, model_name=None, **hints):return db.startswith("tenant_")
django
Erklärung
1
def db_for_read(self, model, **hints):
Interceptor-Methode, die vom Django ORM vor dem Herstellen von Lese-Datenbankverbindungen aufgerufen wird.
2
tenant = hints.get("tenant_id")
Extrahiert Routing-Parameter, die über den QuerySet-Hint-Kontext übergeben wurden.
3
if not tenant: raise KeyError(...)
Erzwingt das Vorhandensein von Parametern durch Abbrechen, wenn Routing-Hints fehlen.
4
return obj1._state.db == obj2._state.db
Stellt sicher, dass Fremdschlüssel-Beziehungen nur Modelle innerhalb derselben Datenbank verknüpfen.