Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

SQLite "no such table" Hatası Nasıl Çözülür?

sqlite-no-such-table-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. SQLite "no such table" hatası için ilk kontrol sırası nedir?
  2. Dosya yolu ve çalışma dizini yanlış tablo hatasına nasıl yol açar?
  3. Bağlantı nesnesi ve CREATE TABLE sırası nasıl denetlenir?
  4. sqlite_master ile veritabanındaki tablolar nasıl listelenir?
  5. Python ile çalışan mini örnek: tabloyu oluştur ve doğrula
  6. Kök neden, belirti ve çözüm için kısa teşhis matrisi
  7. Sık Sorulan Sorular

SQLite "no such table" hatası, sorgunun çalıştığı veritabanında istenen tablonun bulunamadığını gösterir. Çözüm için önce doğru veritabanı dosyasına ve çalışma dizinine bağlandığını, sorgunun kullandığı bağlantı nesnesini, CREATE TABLE komutunun sorgudan önce çalıştığını ve tablo adının birebir eşleştiğini kontrol et.

Hata tek bir nedene indirgenemez. Yanlış dosya açılmış, tablo oluşturma adımı atlanmış veya sorgudaki isim ile oluşturulan isim farklı yazılmış olabilir. Bu nedenle incelemeye dosya yolundan başlayıp bağlantı, sorgu sırası ve tablo adına doğru ilerlemek gerekir.

SQLite "no such table" hatası için ilk kontrol sırası nedir?

Python'da açık bir SQLite veritabanı, sqlite3.connect() tarafından oluşturulan bir Connection nesnesiyle temsil edilir. CREATE TABLE komutu ise belirtilen veritabanında tablo oluşturur. Bu nedenle tabloyu kullanan sorgudan önce doğru bağlantı üzerinde tablo oluşturma adımının çalışmış olması gerekir.

  1. Dosya yolunu doğrula: sqlite3.connect() içine verilen yolun beklediğin veritabanı dosyasını gösterdiğini kontrol et. Dosya adındaki klasör veya uzantı farkı bile farklı bir veritabanına bağlanmaya neden olabilir.
  2. Çalışma dizinini kontrol et: Göreli bir yol kullanıyorsan programın hangi klasörden başlatıldığını incele. Terminal, IDE ve farklı çalıştırma komutları çalışma dizinini değiştirebilir.
  3. Bağlantının doğru dosyaya açıldığını incele: Sorguyu çalıştıran Connection nesnesinin oluşturulduğu sqlite3.connect() çağrısını bul. Kodun farklı yerlerinde birden fazla bağlantı açılıyorsa, kullanılan dosya yollarını karşılaştır.
  4. CREATE TABLE sırasını doğrula: Tabloyu oluşturan sorgunun, SELECT, INSERT veya tabloyu kullanan başka bir sorgudan önce çalıştırıldığından emin ol. Bir fonksiyonun tanımlanmış olması, o fonksiyonun otomatik olarak çağrıldığı anlamına gelmez.
  5. Tablo adını karşılaştır: Oluşturma sorgusundaki ve hata veren sorgudaki tablo adlarını karakter karakter incele. users ile user veya student_records ile student_record aynı ad değildir.

Dosya yolu ve çalışma dizini yanlış tablo hatasına nasıl yol açar?

Dosya yolu ve çalışma dizini yanlış tablo hatasına nasıl yol açar?

SQLite veritabanı diskte tutulduğunda bağlantı bir dosya yolunu hedefler. Python'da sqlite3.connect("data/app.db") gibi bir çağrı bu hedefi belirtir; dosya yoksa normal bağlantı kullanımında yeni bir dosya oluşturulabilir. Göreli yol, geçerli çalışma dizinine göre yorumlandığı için program farklı bir klasörden çalıştırıldığında aynı ifade başka bir dosyayı gösterebilir. Bu dosya beklenen tabloyu içermiyorsa, hata tablo hiç oluşturulmamış gibi görünür.

Göreli yolun hangi konuma çözüldüğünü görmek için pathlib kullanabilirsin:

from pathlib import Path

db_path = Path("data/app.db")

print("Çalışma dizini:", Path.cwd())
print("Veritabanı yolu:", db_path.resolve())
print("Dosya mevcut mu:", db_path.exists())

Örneğin çalışma dizini /proje ise ikinci satırın /proje/data/app.db biçiminde görünmesi beklenir. Bu konumu, tabloyu oluşturduğun veritabanı dosyasının konumuyla karşılaştır. Hedef farklıysa önce bağlantıda kullanılan yolu düzelt; tabloyu listelemeye veya sorguyu değiştirmeye ancak doğru dosyaya bağlandığını doğruladıktan sonra geç.

Bağlantı nesnesi ve CREATE TABLE sırası nasıl denetlenir?

Denetlenecek temel akış şudur: connect, CREATE TABLE, ardından SELECT, INSERT veya UPDATE. Tabloyu oluşturan fonksiyon ile tabloyu kullanan kod, aynı veritabanı dosyasını ve beklenen bağlantı akışını kullanmalıdır. CREATE TABLE IF NOT EXISTS ifadesi, tablo daha önce oluşturulmuşsa yeniden oluşturma hatasını önler.

  1. Bağlantıyı takip et: init_db(conn) ve get_students(conn) gibi fonksiyonlara aynı conn nesnesinin gönderildiğini kontrol et. Fonksiyonlardan biri farklı bir dosya yoluyla yeni bağlantı açıyorsa beklenmeyen veritabanına bakılabilir.
  2. Oluşturma fonksiyonunun çağrıldığını doğrula: Fonksiyonu tanımlamak yeterli değildir. Programın başlangıç akışında, tabloya yönelik ilk sorgudan önce çağrılması gerekir.
  3. Sorgu sırasını incele: SELECT, INSERT veya UPDATE satırı, tabloyu oluşturan CREATE TABLE satırından önce çalışmamalıdır.
  4. Tablo adını karşılaştır: students, student, student_records ve students_records farklı adlardır. Oluşturma sorgusundaki ad ile kullanım sorgusundaki adı bire bir karşılaştır.
import sqlite3

def prepare_database(conn):
    conn.execute("""
        CREATE TABLE IF NOT EXISTS students (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL
        )
    """)
    conn.commit()

conn = sqlite3.connect("school.db")
prepare_database(conn)
rows = conn.execute("SELECT * FROM students").fetchall()

Bu örnekte bağlantı açılır, hazırlık fonksiyonu çağrılır ve ancak bundan sonra students tablosu sorgulanır. commit() çağrısını hazırlık adımında açıkça tutmak, özellikle birden fazla bağlantıyla çalışırken değişikliklerin kaydedilme akışını denetlemeyi kolaylaştırır.

  • Hata hemen oluşuyorsa: Tablo oluşturma fonksiyonu çağrılmamış veya sorgu çok erken çalışıyor olabilir.
  • CREATE TABLE kodu bulunduğu hâlde hata sürüyorsa: İki bölümün farklı dosya yollarıyla bağlantı açıp açmadığını kontrol et.
  • Hata yalnızca belirli bir sorguda görülüyorsa: Tablo adında çoğul eki, alt çizgi veya başka bir yazım farkı bulunabilir.

sqlite_master ile veritabanındaki tablolar nasıl listelenir?

sqlite_master ile veritabanındaki tablolar nasıl listelenir?

Mevcut bağlantının hangi tabloları gördüğünü anlamak için sqlite_master üzerinden şema kayıtlarını listeleyebilirsin. Bu ad, SQLite'ın şema tablosu için kullandığı geçerli adlardan biridir. type = 'table' filtresi yalnızca tablo kayıtlarını seçer.

tables = conn.execute("""
    SELECT name
    FROM sqlite_master
    WHERE type = 'table'
    ORDER BY name
""").fetchall()

print(tables)

Liste tamamen boşsa veya beklenmeyen tablo adları içeriyorsa önce bağlantının dosya yolunu ve kullanılan conn nesnesini incele. Liste içinde student varken sorgu students adını arıyorsa sorun büyük olasılıkla tablo adı ile sorgu yazımının uyuşmamasıdır.

expected_name = "students"

result = conn.execute("""
    SELECT 1
    FROM sqlite_master
    WHERE type = 'table' AND name = ?
""", (expected_name,)).fetchone()

print(result)

result değerinin None olması, mevcut bağlantının tam olarak students adlı bir tablo görmediğini gösterir. Bu durumda tablo listesi boşsa dosya yolu veya bağlantı akışı, benzer bir ad görünüyorsa tablo adının yazımı ve sorgunun kullandığı değişken yeniden denetlenmelidir.

Python ile çalışan mini örnek: tabloyu oluştur ve doğrula

Aşağıdaki örnek, veritabanı dosyasının tam yolunu belirleyip students tablosunu oluşturur. Ardından aynı bağlantı üzerinden sqlite_master kaydını sorgulayarak tablo adını doğrular. sqlite_master, SQLite şema tablosunun kabul edilen adlarından biridir.

from pathlib import Path
import sqlite3

db_path = Path("students_demo.db").resolve()
baglanti = sqlite3.connect(db_path)

baglanti.execute(
    "CREATE TABLE IF NOT EXISTS students "
    "(id INTEGER PRIMARY KEY, name TEXT)"
)
baglanti.commit()

satirlar = baglanti.execute(
    "SELECT name FROM sqlite_master "
    "WHERE type = 'table' ORDER BY name"
).fetchall()
tablo_adlari = [satir[0] for satir in satirlar]

print("Tablolar:", tablo_adlari)
print("students mevcut mu?", "students" in tablo_adlari)

baglanti.close()

Yeni bir students_demo.db dosyasında beklenen çıktı Tablolar: ['students'] ve students mevcut mu? True biçimindedir. Dosyada önceden oluşturulmuş başka tablolar varsa listede onlar da görünebilir. IF NOT EXISTS, aynı adlı tablo zaten bulunuyorsa yeniden oluşturma işlemini atlar; mevcut tablonun yapısını değiştirmez.

Örneğin işe yaramasının nedeni, oluşturma ve doğrulama sorgularının aynı dosyaya açılmış aynı bağlantı üzerinden, doğru sırayla çalışmasıdır. commit() çağrısı da bekleyen işlemi kaydeder. Ancak Path(...).resolve() yolu çalıştırıldığı dizine göre belirler; uygulamayı başka klasörden başlatırsan hangi dosyanın açıldığını yeniden kontrol et.

Kök neden, belirti ve çözüm için kısa teşhis matrisi

no such table hatasında önce görülen belirtiyi eşleştir, sonra ilgili kontrolü uygula. Göreli dosya yolu, çalışılan dizine bağlı olarak farklı bir veritabanı dosyasına karşılık gelebilir.

BelirtiMuhtemel kök nedenKontrolÇözüm
Tablo listesi beklenmedik biçimde boş.Yanlış veya yeni bir veritabanı dosyası açılmış.Bağlantıda kullanılan tam dosya yoluna bak.Tabloların bulunduğu dosyaya bağlan.
Beklenen tablo yerine benzer isimli tablo var.Oluşturma ve sorgulama adları farklı.Listedeki adla sorgudaki adı karşılaştır.Sorguda gerçek tablo adını kullan.
Sorgu, tablo oluşturulmadan çalışıyor.CREATE TABLE adımı henüz yürütülmemiş.Kodun çalışma sırasını izle.Oluşturma adımını sorgudan önce çalıştır.
Uygulama farklı klasörden başlıyor.Göreli yol farklı dosyaya çözülüyor.Çalışma dizinini ve tam dosya yolunu karşılaştır.Hedef dosyanın tam yolunu kullan.
Tablo yalnızca başka bir bağlantıda oluşturuluyor.Bağlantılar farklı dosyaları açıyor veya oluşturma işlemi henüz kaydedilmemiş.İki bağlantının dosya yollarını ve işlem sırasını karşılaştır.Aynı dosyayı kullan; bekleyen işlemi kaydet.

Kontrolü şu sırayla yap:

  1. Bağlantıya verilen veritabanı dosyasının tam yolunu belirle.
  2. Uygulamanın çalışma dizinini kontrol et.
  3. Oluşturma ve sorgulama işlemlerinin hangi bağlantıları kullandığını karşılaştır.
  4. CREATE TABLE komutunun sorgudan önce çalıştığını doğrula.
  5. sqlite_master çıktısında tabloları incele.
  6. Son olarak sorgudaki tablo adını listedeki adla karşılaştır.

Sık Sorulan Sorular

sqlite_master sorgusu neden beklediğim tabloyu göstermiyor?

Bağlantı farklı bir dosyayı açmış olabilir veya tablo oluşturma komutu henüz çalışmamıştır. Önce dosyanın tam yolunu, ardından aynı bağlantı üzerinden alınan tablo listesini kontrol et.

CREATE TABLE kodu yazılı olduğu hâlde neden no such table hatası alırım?

Komutun kodda bulunması, hata alınan sorgudan önce çalıştığı anlamına gelmez. Yürütme sırasını ve iki işlemin aynı veritabanı dosyasını kullanıp kullanmadığını denetle.

Göreli veritabanı yolu uygulamanın yanlış dosyayı açmasına nasıl neden olur?

Göreli yol, uygulamanın çalışma dizinine göre çözümlenir. Başlangıç klasörü değişirse aynı dosya adı başka bir konumu gösterebilir; tam yolu karşılaştırarak bunu saptayabilirsin.

Dosyayı, bağlantıyı ve tablo adını sırayla kontrol etmek, hatanın hangi adımda ortaya çıktığını görmeni sağlar.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara