IndexError: tuple index out of range hatası

Merhabalar,

db = sql.connect("bilgiler.db")

        cur = db.cursor()        

        icerikler = "SELECT * FROM TBilgiler"

        res = cur.execute(icerikler)

        for row in enumerate(res):

            if row[0] == self.ui.eklenenlerTablo.currentRow():

                """

                uruno = row[0]

                alacakkisiadsoyad = row[1]

                telno = row[2]

                esya = row[3]

                parca = row[4]

                yapilacaklar = row[5]

                fiyat = row[6]

                tarih = row[7]

                cur.execute("DELETE FROM TBilgiler WHERE urunno=? AND alacakkisiadsoyad=? AND telno=? AND esya=? AND parca=? AND yapilacaklar=? AND fiyaT=? AND tarih=?", (uruno, alacakkisiadsoyad, telno, esya, parca, yapilacaklar, fiyat, tarih))

                db.commit()

                """

                print(row[2])
  File "c:\Users\emiry\Desktop\TamirProgram²\Arayuz.py", line 139, in silTiklandi
    print(row[2])
IndexError: tuple index out of range

Hem yorum satırına aldığım, hem de printlediğim row yukarıdaki hatayı veriyor. 0 ve 1. olan vermiyor ama 2’den sonrakiler veriyor. Neden veriyor anlamış değilim.

Nasıl düzeltebilirim?

Çünkü burada row[0] enumerate fonksiyonunun çıktılarını (0, 1, 2…) bastırıyor, row[1] res değişkeninin çıktılarını bastırıyor. row[2] de varolmadığı için out of index hatası alıyorsun.

res çıktılarını ve enumerate çıktılarını ayrı ayrı kontrol etmen gerekir:

for num, row in enumerate(res):

Hocam merhaba, dediğiniz yöntem çalıştı. Teşekkür ederim. Fakat bu seferde, tablodan bazen tek, bazen de birçok veri siliyor. Neden olabilir? Ben sadece seçtiğim row silinsin istiyorum.

db = sql.connect("bilgiler.db")

        cur = db.cursor()        

        icerikler = "SELECT * FROM TBilgiler"

        res = cur.execute(icerikler)

        for num, row in enumerate(res):

            uruno = row[0]

            alacakkisiadsoyad = row[1]

            telno = row[2]

            esya = row[3]

            parca = row[4]

            yapilacaklar = row[5]

            fiyat = row[6]

            tarih = row[7]

            cur.execute("DELETE FROM TBilgiler WHERE urunno=? AND alacakkisiadsoyad=? AND telno=? AND esya=? AND parca=? AND yapilacaklar=? AND fiyaT=? AND tarih=?", (uruno, alacakkisiadsoyad, telno, esya, parca, yapilacaklar, fiyat, tarih))

            db.commit()

                

            print(row[2])
1 Beğeni

Buradaki yapıyı tam olarak anlamadım, kodlardaki gerçekleşecek işi yani.

TBilgiler tablosundaki sütunları bir döngü içinde ayırıp, değişkenlere atadık. Sonra da bu değişkenleri SQL’e bir sorgu olarak verip bunu silmek istedik. Yani ya ben gözümden kaçırdım ya da

seçilmiş bir row yok. Bu işlemi neden doğrudan DELETE FROM TBilgiler ile yapmıyoruz ki? Sonuçta silmeyi istediğiniz satırların bilgilerini gene o veritabanından alıyorsunuz. İç içe bir döngü oluşmuyor mu? Yanlış anlamış olabilirim, eğer öyleyse kusuruma bakmayın.

Hocam zaten DELETE kullandım.

        cur.execute("DELETE FROM TBilgiler WHERE urunno=? AND alacakkisiadsoyad=? AND telno=? AND esya=? AND parca=? AND yapilacaklar=? AND fiyaT=? AND tarih=?", (uruno, alacakkisiadsoyad, telno, esya, parca, yapilacaklar, fiyat, tarih))

Koddaki amaç, seçilen row u veritabanında bulmak ve silmek.

Hocam o bug ın nedenini sanırım şimdi çözdüm. Ben deneme amaçlı hiçbir bilgi girmiyordum. Veritabanından, aynı içerikli veriler çarpıştığı için hepsini siliyor olabilir mi?

5 Tane farklı veri ve 5 tane içeriği aynı bilgi ekledim, aynı olunca hepsini sildi, farklı olunca sadece seçtiğimi sildi. Sanırım bir bug olmuş.

1 Beğeni

Evet ondan dolayı olabilir.

Benim demek istediğim, WHERE ile verdiğimiz şunları şunları sil kriterleri, zaten veritabanındaki veriler. Yani

ile
cur.execute("DELETE FROM TBilgiler") aynı anlama gelecek demek istemiştim. Sonuç olarak, sorun çözüldüyse, sorun çözülmüştür :slight_smile:

1 Beğeni