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