Ponieważ Python DB API jest domyślnie w trybie AUTOCOMMIT=OFF i (przynajmniej dla MySQLdb) na poziomie izolacji POWTARZALNY ODCZYT. Oznacza to, że za kulisami masz trwającą transakcję bazodanową (InnoDB to silnik transakcyjny), w której pierwszy dostęp do danego wiersza (a może nawet tabeli, nie jestem pewien) naprawia „widok” tego zasobu dla pozostałej części transakcji.
Aby temu zapobiec, musisz „odświeżyć” bieżącą transakcję:
from django.db import transaction
@transaction.autocommit
def my_count():
while True:
transaction.commit()
print "Number of Things: %d" % Thing.objects.count()
time.sleep(5)
-- zauważ, że transaction.autocommit dekorator służy tylko do wejścia w tryb zarządzania transakcjami (można to również zrobić ręcznie za pomocą funkcji transaction.enter_transaction_management/leave_transaction_managemen).
Jeszcze jedna rzecz - aby być świadomym - autocommit Django nie jest tym samym autocommitem, który masz w bazie danych - jest całkowicie niezależny. Ale to jest poza zakresem tego pytania.
Edytowano 22.01.2012
Tutaj to „podwójna odpowiedź” na podobne pytanie.