Обновление БД в работающем приложении
Я постарался воссоздать минимально воспроизводимый код, коротко о нем: Подключение к БД
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_())
Проблема: Я хочу что бы цикл который применяет и меняет значения в БД, делал все автоматически. Но когда второй раз пытаюсь поменять значения, он меняет его так же каки в первый, то есть изменений не увидел. Выяснилось что до перезапуска приложения все обновления не видны приложению. Подскажите как сделать постоянное обновление БД в работающем приложении.
Я пробовал сделать в цикле постоянное открывание и закрывание таблицы, но появлялась ошибка с потоками.