WHERE col != hodnota (Prisma not) tiše vynechá NULL řádky
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Hromadná synchronizace „přepiš přiřazení všech podřízených záznamů kromě těch, co už mají novou hodnotu” funguje pro už přiřazené záznamy, ale nepřiřazené (NULL) záznamy tiše přeskočí. Žádná chyba, count v odpovědi prostě NULL řádky nezahrnuje. Odhaleno až E2E testem na reálných datech, unit testy měly všechny řádky vyplněné.
Root cause
Sekce “Root cause”SQL tříhodnotová logika: NULL != 'x' není TRUE, ale NULL → řádek neprojde WHERE. Prisma { not: value } generuje <> value, takže má stejné chování:
// „všem leadům kromě těch, co už mají newOwner" — NULL leady se NIKDY nepropíšouawait prisma.lead.updateMany({ where: { clientId, assignedToId: { not: newOwner } }, data: { assignedToId: newOwner },});Fix
Sekce “Fix”await prisma.lead.updateMany({ where: { clientId, OR: [{ assignedToId: null }, { assignedToId: { not: newOwner } }], }, data: { assignedToId: newOwner },});V raw SQL ekvivalentně WHERE col IS DISTINCT FROM $1 (PostgreSQL) — IS DISTINCT FROM s NULL pracuje jako běžné porovnání.
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: grep
{ not:v Prisma where klauzulích a!=/<>v raw SQL nad nullable sloupci; test case s NULL hodnotou do každého testu bulk synchronizace. - Anti-pattern: „update všech kromě X” nad nullable sloupcem bez explicitního ošetření NULL.
- Lepší přístup: PostgreSQL
IS DISTINCT FROM; v Prisma explicitní OR s null; v code review se u nullable polí ptát na NULL větev.
Sister bugs / související
Sekce “Sister bugs / související”Stejná past platí pro NOT IN (...) — jediná NULL hodnota v seznamu zneguje celou podmínku. A pro filtrování: WHERE col != 'x' v reportech tiše vyřadí NULL řádky ze statistik.