Supabase Error fetching items: ERROR: prepared statement “stmtcache_” already exists (SQLSTATE 42P05) exit

Bu hata (SQLSTATE 42P05), veritabanı sürücünüzün “Prepared Statement” (Hazırlanmış İfade) önbelleğe alma mekanizmasının, Supabase’in bağlantı havuzu (connection pooler – Supavisor/PgBouncer) ile çakışmasından kaynaklanır.

Log formatınıza (2026/06/26 17:01:31 ... exit status 1) bakılırsa büyük ihtimalle Go (Golang) kullanıyorsunuz.

Supabase, bağlantıları yönetmek için varsayılan olarak “Transaction” modunda bir havuz kullanır (genellikle port 6543). Bu modda, uygulamanız bir prepared statement oluşturup bunu önbelleğe aldığında (isim: stmtcache_...), bir sonraki sorguda havuz size farklı bir arka plan bağlantısı verebilir veya aynı bağlantıyı başka bir işlem için kullanabilir. Bu durum, PostgreSQL’in “bu isimde bir statement zaten var” hatası vermesine sebep olur.

İşte bu sorunu çözmek için uygulayabileceğiniz yöntemler:

Çözüm 1: ORM / Sürücü Seviyesinde Prepared Statement’ları Kapatmak (Önerilen)

Eğer uygulamanızda çok sayıda anlık bağlantı yapılıyorsa (örneğin serverless/Lambda fonksiyonları), bağlantı havuzunu (Port 6543) kullanmaya devam etmeli ama sürücünüzün statement önbelleğini kapatmalısınız.

Eğer Go ve GORM kullanıyorsanız: Veritabanı bağlantınızı başlatırken PrepareStmt özelliğini false olarak ayarlayın:

db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
    PrepareStmt: false, // Bu ayarı false yapın veya tamamen kaldırın (varsayılan false'tur)
})

Eğer Go ve pgx sürücüsünü kullanıyorsanız: Bağlantı dizesinin (connection string) sonuna statement cache’i devre dışı bırakacak parametreler ekleyin:

postgres://postgres.[projeniz]:[şifreniz]@aws-0-eu-central-1.pooler.supabase.com:6543/postgres?default_query_exec_mode=exec

Veya bağlantı dizesinde statement_cache_capacity=0 parametresini kullanın.


Çözüm 2: Supabase Doğrudan Bağlantısını (Direct Connection) Kullanmak

Eğer uygulamanız uzun süre çalışan (long-running) bir sunucuda çalışıyorsa ve bağlantı sınırlarını aşma riskiniz yoksa, Supabase’in bağlantı havuzunu bypass edip doğrudan veritabanına bağlanabilirsiniz. Doğrudan bağlantılarda prepared statement’lar sorunsuz çalışır.

Supabase Dashboard’dan alacağınız bağlantı dizesindeki portu 6543 yerine 5432 olarak değiştirin:

  • Hata veren bağlantı (Pooler): [...pooler.supabase.com:6543/postgres](https://...pooler.supabase.com:6543/postgres)
  • Sorunsuz çalışacak bağlantı (Direct): [...db.supabase.com:5432/postgres](https://...db.supabase.com:5432/postgres)

(Not: Supabase yakın zamanda pooler altyapısını güncelledi, eğer yeni Supavisor kullanıyorsanız host adresi aynı kalıp sadece port 5432 olarak değişebilir. Dashboard -> Database -> Settings -> Connection String altından “Direct Connection” seçeneğini kopyalayabilirsiniz.)

Özetle: Supabase pooler (6543) kullanıyorsanız driver’ın statement önbelleğini kapatın. Eğer önbelleği kapatamıyor veya kapatmak istemiyorsanız, doğrudan bağlantı portunu (5432) kullanın.