python / intermediate
Snippet
Überprüfung der Datenbank-Abfrageeffizienz in Django-Unittests mit assertNumQueries
Der Kontextmanager assertNumQueries in Django TestCase stellt sicher, dass der Code im Block eine exakte Anzahl von SQL-Abfragen ausführt. Dies hilft, N+1-Abfrageprobleme frühzeitig in automatisierten Test-Pipelines zu erkennen.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
from django.test import TestCasefrom myapp.models import Authorclass QueryEfficiencyTest(TestCase):def test_author_books_fetch_count(self):Author.objects.create(name="Jane Doe")with self.assertNumQueries(1):authors = list(Author.objects.prefetch_related('books'))for author in authors:_ = list(author.books.all())
django
Erklärung
1
with self.assertNumQueries(1):
Kontextmanager, der ausgeführe SQL-Abfragen überwacht und einen AssertionError auslöst, wenn die Anzahl != 1 ist.
2
authors = list(Author.objects.prefetch_related('books'))
Erzwingt die Auswertung des QuerySets und lädt zugehörige Bücher in einer einzigen Abfrage in den Cache.
3
for author in authors:
Iteriert über gecachte Ergebnisse, ohne zusätzliche Datenbankzugriffe auszulösen.