← Powrót do bloga
·8 minut czytania·

Python i Postgres: Przestań wciągać tabelę do pamięci

SQL może być poprawny, a API nadal umiera: nieograniczone .all(), zapytania f-string, ORM N+1, nowe połączenie na żądanie, pandy jako magazyn w przeglądarce internetowej. Jak utrzymać Pythona w pobliżu Postgres w 2026 roku.

PythonPostgreSQLFastAPISQL-aWydajnośćInżynieria
Zatrudnij mnie na Upwork

Artykuł SQL jest zapytaniem. To jest Python, które nie chce tego cofnąć. Ciągle widzę ten sam wypadek: trasa FastAPI, która wygląda na czystą, model SQLAlchemy, który wygląda na czysty, i zestaw roboczy o rozmiarze 200 MB, ponieważ scalars().all() oznacza „wszystko”. Baza spełniła swoje zadanie. Aplikacja poprosiła o plik CSV magazynu.

Napisałem już pięć kształtów SQL, których używam zamiast pętli. Ten element to koperta: parametry, pula, limit czasu i dyscyplina, aby nie gromadzić tabeli, ponieważ ramka danych API jest wygodna.

1. Skrypt, który działał na 800 wierszach

Zrzut lokalny, pandas, groupby, to_excel. Następnie ktoś wskazuje go na produkcję „tylko dla tego raportu”. To nie jest raport. Jest to ekstrakt podstawowej bazy danych do procesu, który zostanie zabity przez OOM. Jeśli odpowiedzią jest liczba, lista pięćdziesięciu wierszy lub plik, który możesz przesłać strumieniowo, nie zbieraj tabeli. Piszę agregację w SQL – lub zmaterializowany widok, jeśli jest to codziennie – i zachowuję Python jako kopertę: auth, parametry, format.

2. f-stringi nie są zapytaniem API

Budowanie SELECT * FROM zamówień WHERE id = {order_id} z ciągiem f to sposób przekazywania bazy danych. Użyj parametrów $1, %(id)s lub parametrów powiązanych. Każdy kierowca je ma. SQLAlchemy text() je ma. LLM, który łączy SQL, to ten sam błąd, ale z lepszymi manierami. Ta sama rodzina: budowanie list IN poprzez łączenie ciągów. Użyj ANY($1::int[]) lub odpowiedniego powiązania. Nie ucieknę od tego.

3. ORM N+1, który wygląda jak czysty Python

dla faktur na fakturach: faktura.nazwa.klienta to zapytanie plus-jeden w każdym wierszu. selectinload, złączenie lub dedykowane zapytanie listowe. „Dodam moduł ładujący później” – tak strona z listą umiera po targach. Używam ORM do zapisów pasujących do jednostki pracy – utwórz porządek plus linie w jednej sesji. Używam SQL do stron list i eksportów. Hybryda to nie porażka. ORM, który ukrywa czterysta zapytań, to.

4. Jedno połączenie na żądanie nie stanowi puli

Otwarcie psycopg w każdym programie obsługi lub utworzenie silnika wewnątrz funkcji to sposób na trafienie max_connections podczas wdrażania. Jeden silnik lub jedna pula asynchroniczna dla procesu. Przerwa w przejęciu. Kasa, która nie może przetrwać oczekiwania wywołującego inną usługę. asyncpg lub psycopg 3 dla kontrolowanej przeze mnie ścieżki aktywnej. SQLAlchemy, jeśli zespół myśli już w sesjach, a ja potrzebuję migracji plus mapa tożsamości. Nie uruchamiam trzech ORM-ów, ponieważ w samouczku wykorzystano Django.

5. Pandas to druga baza danych – traktuj ją jak jedną

Grupowanie pandas w ramce o rozmiarze dwóch gigabajtów to zapytanie magazynowe uruchamiane na skrzynce API. Jeśli potrzebujesz pandas, ekstrakt powinien być już wąski: kolumny, których używasz, dzień, którego potrzebujesz, KOPIA lub cursor po stronie serwera. rozmiar kawałka istnieje. fetchmany istnieje. plon istnieje. Lubię pandas w zeszytach analitycznych. Nie podoba mi się to jako implementacja /stats. Ta trasa to SQL plus wpisany dykt.

6. Co faktycznie wysyłam

Router FastAPI. Zwalidowano parametry – daty, identyfikator obszaru roboczego, limit. Funkcja, która uruchamia jedno sparametryzowane zapytanie, często kształty funkcji okna z innego artykułu. Basen. Upłynął limit czasu instrukcji, więc zły plan powoduje niepowodzenie żądania zamiast instancji. Nie WYBIERZ *. Brak cichej funkcji .all() na nieograniczonej tabeli. Jedno żądanie, jedna transakcja, chyba że mam konkretny powód – skrzynka nadawcza, przekazanie płatności. Izolacja pozostaje CZYTAJ ZOBOWIĄZANA, dopóki nie będę w stanie nazwać anomalii, której się boję.

Wniosek: klej jest dozwolony, drugi magazyn nie

Python to najlepszy klej, jaki mam do HTTP i zadań. Staje się drogie, gdy podszywa się pod Postgres. Napisz zapytanie, powiąż parametry, strumień lub agregację i staraj się, aby proces był niewielki. Sprytna pętla może poczekać. Baza danych miała już lepszą – to już inny artykuł.

Zatrudnij jednym kliknięciem

Zatrudnij mnie jako programistę jednym kliknięciem. Rozpocznij bezpieczną umowę Upwork na tworzenie rozwiązań internetowych o wysokiej konwersji dla Twojej firmy.

Zatrudnij mnie na Upwork

Chcesz omówić swój projekt?

Jestem starszym inżynierem stron internetowych specjalizującym się w React i Next.js - dostępnym dla niezależnych projektów na całym świecie.