Обновление БД в работающем приложении

Я постарался воссоздать минимально воспроизводимый код, коротко о нем: Подключение к БД

 try:
            sqlite_connection = sqlite3.connect(DeviceBase)
            cursor = sqlite_connection.cursor()
            print("Подключен к SQLite")
        except sqlite3.Error as error:
            print("Ошибка при работе с SQLite", error)
        
        def insert_varible_into_table(Inventory, Serial, Model, Owner, Location, self): #добавление данных в SQLite
            sqlite_insert_with_param = """INSERT INTO DeviceList
                                    (Inv, Serial, Model, Owner, Location)
                                    VALUES (?, ?, ?, ?, ?);"""
            data_tuple = (Inventory, Serial, Model, Owner, Location)
            cursor.execute(sqlite_insert_with_param, data_tuple)
            sqlite_connection.commit()
            print("Переменные Python успешно вставлены в таблицу DeviceList")
        
        def LoadLocDevice():
            cursor.execute("SELECT * FROM LocDevice")
            Data = cursor.fetchall()
            return Data
        
        
        cursor.execute("SELECT * FROM RFID")
        RFID_list = cursor.fetchall()
        LocDevice = LoadLocDevice()
        
        def insert_varible_into_table_RFID(Inventory, RFID): #добавление данных в SQLit
            if Inventory in str(RFID_list):
                cursor.execute("""DELETE FROM RFID WHERE inv = ?""", Inventory)
                sqlite_connection.commit()
            sqlite_insert_with_param = """INSERT INTO RFID
                                    (Inv, RFID)
                                    VALUES (?, ?);"""
            data_tuple = (Inventory, RFID)
            cursor.execute(sqlite_insert_with_param, data_tuple)
            sqlite_connection.commit()
            print("Переменные Python успешно вставлены в таблицу RFID")
    
    test_rfid = ''

Цикл для автоматического изменения записей в БД

class ProgressBarThread(QThread):
        values_changed = pyqtSignal(object)               
        label_changed = pyqtSignal(str, str)
        combo_Box = pyqtSignal(object) 
        def __init__(self, mainwindow, parant=None):
            super().__init__()
            self.mainwindow = mainwindow
        def run(self):
            select_text = self.mainwindow.comboBox.currentText()
            item_text = self.mainwindow.comboBox.itemText(1)
            global res1
            current_rfid = ''
            while True:
                with open(textbase) as file:
                    RFID_original = file.readlines()[-1]
                    RFID = RFID_original.partition(';')[0]
                    if RFID in str(RFID_list):
                        *res1, = filter(lambda x: x[1] == RFID, RFID_list)
                        res1 = np.array(res1)
                        for item in LocDevice:
                            if str(res1[0][0]) == str(item[0]):
                                if str(item[1]) == select_text:
                                    self.text_changed(item_text)
                                elif str(item[1]) != str(select_text):
                                    self.text_changed(select_text)
                    else:
                        test_rfid = RFID
                self.msleep(1000)
        
        
    
        
    
    
        def text_changed(self, s):
            result = s
            conn = sqlite3.connect(DeviceBase)
            cursor = conn.cursor()
            box = "UPDATE LocDevice SET Status = ? WHERE Inventory = ?"
            Box = cursor.execute(box, (result, res1[0][0]))
            print(result)
            conn.commit()
            conn.close()
            return Box

Код QT

class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.comboBox = QtWidgets.QComboBox(self.centralwidget)
            self.comboBox.setGeometry(QtCore.QRect(260, 380, 251, 51))
            self.comboBox.setObjectName("comboBox")
            self.comboBox.addItem("")
            self.comboBox.addItem("")
            self.label = QtWidgets.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(330, 70, 131, 51))
            self.label.setObjectName("label")
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(310, 240, 111, 41))
            self.pushButton.setObjectName("pushButton")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.comboBox.setItemText(0, _translate("MainWindow", "Factory"))
            self.comboBox.setItemText(1, _translate("MainWindow", "Room"))
            self.label.setText(_translate("MainWindow", "TextLabel"))
            self.pushButton.setText(_translate("MainWindow", "PushButton"))

Функция отвечающая за начала работы цикла

self.pushButton.clicked.connect(self.launch_progress_bar_filling)
            self.ProgressbarThread_instance = ProgressBarThread(mainwindow=self)
    
        def launch_progress_bar_filling(self):
            self.pushButton.setEnabled(False)
            self.ProgressbarThread_instance.start()
    
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())

Проблема: Я хочу что бы цикл который применяет и меняет значения в БД, делал все автоматически. Но когда второй раз пытаюсь поменять значения, он меняет его так же каки в первый, то есть изменений не увидел. Выяснилось что до перезапуска приложения все обновления не видны приложению. Подскажите как сделать постоянное обновление БД в работающем приложении.

Я пробовал сделать в цикле постоянное открывание и закрывание таблицы, но появлялась ошибка с потоками.


Ответы (0 шт):