Не работают внешние ключи при работе в приложении, написанном с помощью PyQt6
Данные в столбцах, которые являются внешними ключами одних таблиц, не изменяются при изменении данных в связанных первичных ключах других таблиц.
Базу данных sqlite я проверял в приложении DB Browser (SQLite). Там всё работает.
Вот основная часть кода:
if __name__ == "__main__":
import time, sys
app = QtWidgets.QApplication(sys.argv)
splash = QtWidgets.QSplashScreen(QtGui.QPixmap("EJustice.png"))
splash.show()
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('data.sqlite')
con.open()
window_1 = Window_1()
window_2 = Window_2()
window_3 = Window_3()
window_4 = Window_4()
window_5 = Window_5()
window_6 = Window_6()
window_7 = Window_7()
window_8 = Window_8(window_7)
window_9 = Window_9()
window = Window(window_1, window_2, window_3, window_4, window_5, window_6,
window_8, window_9)
query = QtSql.QSqlQuery()
query2 = QtSql.QSqlQuery()
ico = QtGui.QIcon("icon.png")
app.setWindowIcon(ico)
time.sleep(3)
window.show()
splash.finish(window)
sys.exit(app.exec())
Ответы (2 шт):
Итак, вам нужно сделать так, чтобы ваши виджеты форм оповещали таблицу о том, что ей нужно обновить загруженные данные. Сделать это можно через механизм сигнал-слотов qt.
Для начала выгодно будет завести класс, содержащий сигнал, который будет оповещать о том, что нужно обновить таблицу.
class SuperForm(QtWidgets.QWidget):
update_table = QtCore.pyqtSignal()
Далее, каждую форму, после работы которой требуется обновить таблицу наследуем от него. Например:
class Window_2(SuperForm):
А в методе после которого нужно обновить таблицу вызываем:
def ChangePrimaryKey(self):
query2.clear()
query2.prepare('update Студенты set ID_студента = ? where ID_студента = ?')
query2.addBindValue(int(self.lineEdit_1.text()))
query2.addBindValue(query.value('ID_студента'))
query2.exec()
quer = query.at()
query.clear()
query.exec("select * from Студенты")
query.seek(quer)
self.update_table.emit() #Запрашиваем обновление таблицы
Для того, чтобы данный механизм работал, нужно создать слот в классе с таблицей, который и будет осуществлять обновление:
class Window_1(QtWidgets.QWidget):
def on_update_table(self):
self.stm.select()
И подсоединить к нему сигналы:
class Window(QtWidgets.QWidget):
def __init__(self, *other_window, parent=None):
super().__init__(parent)
for window in other_window:
if issubclass(type(window), SuperForm):
window.update_table.connect(other_window[0].on_update_table)
Для других ваших виджетов с таблицами можно поступить аналогично.
Это, так сказать, решение в лоб. Оно лишь демонстрирует принцип. Здесь многое не учитывается, например то, что таблицу в определённых ситуация вообще не нужно обновлять и т.п.
Я понял в чем проблема. В бд sqlite по умолчанию выключена поддержка внешних ключей. Всё, что нужно было сделать - добавить две строчки после создания запроса query:
query.exec("PRAGMA foreign_keys = ON")
query.clear()