NOT IN s tisíci hodnotami přesáhne limit délky URL
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Listing produktů na homepage i v katalogu je najednou prázdný, přestože v DB jsou tisíce viditelných záznamů. V logu žádná chyba. Klient vidí prázdný web.
Root cause
Sekce “Root cause”Dotaz filtroval NOT IN (uuid1, …, uuid240) se stovkami UUID. REST gateway (PostgREST) posílá filtry v query stringu URL. Po hromadném zablokování ~184 entit URL přesáhla limit délky (~8 KB na gateway/proxy) → request je tiše odmítnut a klient dostane data: null, error: null. Práh nastává kolem ~150–200 hodnot.
Fix
Sekce “Fix”Nahradit NOT IN (...) za INNER JOIN na související tabulku s filtrem — podmínka je v SQL WHERE, ne v URL, takže škáluje na libovolný počet:
// místo .not('id', 'in', `(${blockedIds.join(',')})`).select('*, relation!inner(flag)').eq('relation.flag', false)Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: grepni
.in(/.not(...'in'...)s polem, jehož délka není shora omezená. - Anti-pattern: dynamický seznam ID v URL filtru, který roste s daty.
- Lepší přístup: JOIN/EXISTS, nebo RPC s
text[]/uuid[]parametrem v těle requestu. - Monitor: alert, když render vrátí 0 výsledků a DB přitom má >práh záznamů.