Kodlarınızı düzenledim. Gerekli yerlere açıklamalar ekledim. Kodlar çalışıyor, veritabanında değişiklik yapılabiliyor artık. Bir bakın isterseniz.
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
from arayuz import Ui_MainWindow as arayuz
from PyQt5.QtWidgets import QMainWindow,QApplication,QFileDialog
from PyQt5 import QtWidgets
import os
import sqlite3
class goster_veritabani(QMainWindow):
def __init__(self):
super().__init__()
self.tablo = []
self.columns = []
self.tablo_adi = None
self.imlec = None
self.baglanti = None
self.ac_pencere()
def dosya_sec(self):
self.file_dialog = QFileDialog(self)
self.open_file = self.file_dialog.getOpenFileName(
self,
"Dosya Aç",
os.getenv("HOME")
)
return self.open_file[0]
def veri_yukle(self):
dosya = self.dosya_sec()
self.baglanti = sqlite3.connect(dosya)
self.imlec = self.baglanti.cursor()
self.imlec.execute("SELECT name FROM sqlite_master")
self.tablo_adi = self.imlec.fetchall()
self.imlec.execute(
"SELECT * FROM {ta}".format(ta=self.tablo_adi[0][0])
)
veri = self.imlec.fetchall()
# Orijinal veriler tabloda tutulacak, veriler üzerinde değişiklik
# yapılırsa bu tablo karşılaştırma için kullanılacak.
# Siz verileri parcacik.text() diye çektiğiniz için ben bütün verileri
# string verisine dönüştürdüm.
self.tablo = [[str(j) for j in i] for i in veri]
# Sütun ismi için.
self.columns = [i[0] for i in self.imlec.description]
for satir_say, satir_veri in enumerate(veri):
for sutun_say, veri in enumerate(satir_veri):
self.ui.tablo.setItem(
satir_say,
sutun_say,
QtWidgets.QTableWidgetItem(str(veri))
)
def veri_isle(self, veriler):
for orijinal, editted in zip(self.tablo, veriler): # tablo ile GUI'deki veriler karşılaştırılacak.
if orijinal != editted: # Eğer tablonun satır verisi, gui'deki satır verisine eşit değilse
for index, (i, j) in enumerate(zip(orijinal, editted)): # Satır verisindeki her bir sütun için
if i != j: # Sütun değerlerinin aynı olup olmadığına bakılacak. Eğer aynı değilse,
# Aşağıdaki ifade ile tablo verisi değiştirilecek.
sorgu = f"UPDATE {self.tablo_adi[0][0]} SET " \
f"{self.columns[index]} = ? " \
f"WHERE {self.columns[1]} = ?"
self.imlec.execute(sorgu, (j, orijinal[1]))
# Değişiklikleri işleme sokuyoruz.
self.baglanti.commit()
# Veritabanını kapatıyoruz.
self.baglanti.close()
def veri_cek(self):
veriler = []
for satir in range(len(self.tablo)): # Tablodaki satır sayısı kadar
veri_satir = [] # Satır oluştur
for sutun in range(len(self.tablo[0])): # Bir satırdaki sütun sayısı kadar
parcacik = self.ui.tablo.item(satir, sutun) # verileri al
veri_satir.append(parcacik.text()) # Alınan verileri satır verisine ekle
veriler.append(veri_satir) # Satır verisini de verilere ekle.
self.veri_isle(veriler) # veri_isle fonksiyonuna verileri argüman olarak ver.
def baglantilar(self):
self.ui.buton_yukle.clicked.connect(self.veri_yukle)
self.ui.buton_degistir.clicked.connect(self.veri_cek)
def ac_pencere(self):
self.ui = arayuz()
self.ui.setupUi(self)
self.baglantilar()
if __name__ == "__main__":
uygulama = QApplication([])
ana_pencere = goster_veritabani()
ana_pencere.show()
uygulama.exec_()
Sizin SQL ifadenizde bir hata vardı, ifadenin olması gereken hali şöyle:
f"UPDATE {tablo_ismi} SET {sutun_ismi} = ? WHERE {sutun_ismi} = ?"
WHERE
'den sonraki sütun ismi, illa ki SET
ile değiştirilecek sütun olmak zorunda değil, ama olabilir de.