Přeskočit na obsah

NOT IN s tisíci hodnotami přesáhne limit délky URL

import { Aside } from ‘@astrojs/starlight/components’;

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.

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.

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ů.

Sister bugs / související

Sekce “Sister bugs / související”
Přidal aiarchitekt.cz · 25. 5. 2026 17:41
Provozuje aiarchitekt.cz