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.
Çü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:
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])
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.
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ş.