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.
- 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. - Ç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.
- Bağlantının doğru dosyaya açıldığını incele: Sorguyu çalıştıran
Connectionnesnesinin oluşturulduğusqlite3.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. CREATE TABLEsırasını doğrula: Tabloyu oluşturan sorgunun,SELECT,INSERTveya 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.- Tablo adını karşılaştır: Oluşturma sorgusundaki ve hata veren sorgudaki tablo adlarını karakter karakter incele.
usersileuserveyastudent_recordsilestudent_recordaynı ad değildir.
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.
- Bağlantıyı takip et:
init_db(conn)veget_students(conn)gibi fonksiyonlara aynıconnnesnesinin gönderildiğini kontrol et. Fonksiyonlardan biri farklı bir dosya yoluyla yeni bağlantı açıyorsa beklenmeyen veritabanına bakılabilir. - 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.
- Sorgu sırasını incele:
SELECT,INSERTveyaUPDATEsatırı, tabloyu oluşturanCREATE TABLEsatırından önce çalışmamalıdır. - Tablo adını karşılaştır:
students,student,student_recordsvestudents_recordsfarklı 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?

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.
| Belirti | Muhtemel kök neden | Kontrol | Çö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:
- Bağlantıya verilen veritabanı dosyasının tam yolunu belirle.
- Uygulamanın çalışma dizinini kontrol et.
- Oluşturma ve sorgulama işlemlerinin hangi bağlantıları kullandığını karşılaştır.
CREATE TABLEkomutunun sorgudan önce çalıştığını doğrula.sqlite_masterçıktısında tabloları incele.- 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.