464
Rozdział 11
3
/
4
Instrukcja insert to nie instrukcja select
Czy masz zamiar zasugerować, że
kod funkcji log_request mógłby
w jakiś sposób wykonywać się
jednocześnie z pozostałym kodem
aplikacji WWW?
Tak. To nasz szalony pomysł.
Gdy użytkownicy Twojej aplikacji przeprowadzają nowe
wyszukiwanie, zupełnie nie obchodzi ich, że szczegóły
związane z żądaniem sieciowym są logowane w jakiejś
bazie danych działającej po stronie backendu, dlatego
nie powinniśmy ich zmuszać do oczekiwania, aż aplikacja
poradzi sobie z tym zadaniem.
Zamiast tego sprawmy, aby jakiś inny proces wykonał
operację logowania
kiedyś i w sposób całkowicie
niezależny od głównej funkcji aplikacji WWW (którą
jest umożliwienie użytkownikom przeprowadzania
wyszukiwań).
Instrukcje INSERT i SELECT są różne
Jeśli czytając tytuł tego podrozdziału, pomyślałeś sobie „Oczywiście, że są!”, zapewniamy Cię (co prawda na
dość zaawansowanym etapie lektury tej książki), że nie postradaliśmy zmysłów.
Tak, instrukcja
INSERT
języka SQL różni się od jego instrukcji
SELECT
, ale jeśli chodzi o Twoje zastosowanie
obydwu tych instrukcji w aplikacji WWW, okazuje się, że instrukcja
INSERT
występująca w funkcji
log_request
wcale nie musi jej blokować, podczas gdy instrukcja
SELECT
należąca do funkcji
view_the_log
musi to robić,
co sprawia, że zapytania zawierające te instrukcje są
zupełnie inne.
Spostrzeżenie to ma kluczowe znaczenie.
Gdyby znajdująca się w funkcji
view_the_log
instrukcja
SELECT
nie oczekiwała na dane zwrócone z bazy danych
działającej po stronie backendu, kod występujący po wywołaniu metody
cursor.execute
prawdopodobnie by
zawiódł (ponieważ nie miałby danych, na których powinien operować). Funkcja
view_the_log
musi
blokować
aplikację, ponieważ musi czekać na dane, zanim będzie mogła kontynuować swoje działanie.
Gdy w swojej aplikacji WWW wywołujesz funkcję
log_request
, chcesz zalogować w bazie danych szczegóły
związane z bieżącym żądaniem sieciowym. Tak naprawdę nie obchodzi Cię,
kiedy do tego dojdzie, chodzi Ci tylko
o to, aby się to stało. Funkcja
log_request
nie zwraca wartości ani danych; kod wywołujący nie musi czekać na
odpowiedź. Wszystko, o co tu dbamy, sprowadza się do tego, aby żądanie sieciowe zostało
ostatecznie zalogowane.
To z kolei prowadzi do pytania: dlaczego funkcja
log_request
zmusza kod wywołujący do oczekiwania?
Get Python Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.