← nitronium.dev
PostgreSQL: NULL değerli unique kolonda upsert sessizce kırılır
2026-06-20
SQLAlchemy'de on_conflict_do_update(index_elements=["tescil_no"]) kullanırken dikkat edilmesi gereken bir davranış: PostgreSQL'de unique constraint, NULL değerleri birbirinden farklı sayar. Yani tescil_no NULL olan iki satır unique ihlali oluşturmaz.
Pratikte ne oluyor: scanner her çalışmasında tescil_no=None olan kayıtları tekrar insert ediyor, conflict hiç tetiklenmiyor ve tablo her seferinde şişiyor.
Hatayı fark ettiren belirti: satır sayısı her cron çalışmasından sonra artıyor ama aynı marka tekrar tekrar listeleniyor.
Fix basit — parse aşamasında tescil_no boşsa kaydı düşür:
`python
tescil_no = raw.get("applicationNumber") or None
if not tescil_no:
return None
`
Dedup key olmadan upsert yapılamaz. on_conflict mekanizması NULL üzerinde çalışmaz çünkü SQL standardına göre NULL = NULL yanlış.
PostgreSQL dökümanı bunu açıkça belirtiyor: "null values are not considered equal for purposes of a unique constraint." Ancak bunu production'da fark etmek için ya tabloyu saymak ya da birden fazla cron döngüsü beklemek gerekiyor.