Не работают внешние ключи при работе в приложении, написанном с помощью 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 шт):

Автор решения: needKVAS

Итак, вам нужно сделать так, чтобы ваши виджеты форм оповещали таблицу о том, что ей нужно обновить загруженные данные. Сделать это можно через механизм сигнал-слотов 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)

Для других ваших виджетов с таблицами можно поступить аналогично.

Это, так сказать, решение в лоб. Оно лишь демонстрирует принцип. Здесь многое не учитывается, например то, что таблицу в определённых ситуация вообще не нужно обновлять и т.п.

→ Ссылка
Автор решения: McPoint

Я понял в чем проблема. В бд sqlite по умолчанию выключена поддержка внешних ключей. Всё, что нужно было сделать - добавить две строчки после создания запроса query:

query.exec("PRAGMA foreign_keys = ON")
query.clear()
→ Ссылка