QAbstractItemModel :: removeRow не удаляет записи в связанных таблицах - PullRequest
0 голосов
/ 18 апреля 2020

Qt5.14.0, sqlite3. Я создаю две таблицы:

CREATE TABLE manufacturing (pn TEXT PRIMARY KEY, model TEXT NOT NULL, sn TEXT, FOREIGN KEY (pn) REFERENCES settings (pn) ON DELETE CASCADE ON UPDATE CASCADE);

CREATE TABLE settings (pn TEXT NOT NULL, name TEXT NOT NULL, value TEXT, PRIMARY KEY (pn, name));

В таблице settings у меня есть несколько таких записей:

abc|foo1|11
abc|foo2|22
abc|foo3|33
def|foo1|11
def|foo2|22
def|foo3|33

и в таблице manufacturing:

abc|model1|123
def|model2|234

В своем приложении я создал два QSqlTableModel s для отображения данных на TableView s:

_modelManufacturing = new QSqlTableModel(this, QSqlDatabase::database("dbData"));
_modelManufacturing->setTable("manufacturing");
_modelManufacturing->select();
ui->tableManufacturing->setModel(_modelManufacturing);

_modelSettings = new QSqlTableModel(this, QSqlDatabase::database("dbData"));
_modelSettings->setTable("settings");
ui->tableSettings->setModel(_modelSettings);

Кстати, я фильтрую вторую таблицу по мере необходимости:

_modelSettings->setFilter("pn=\"" + ui->linePN->text() + "\"");
_modelSettings->select();

Теперь я удаляю строку в таблице manufacturing:

_modelManufacturing->removeRow(ui->listDb->currentIndex().row());

, потому что я установил флаг ON DELETE CASCADE. Я ожидаю также записи в таблице settings с той же pn должны быть удалены. Вместо этого они не затронуты.

Почему? Как автоматически удалить их, когда я удаляю соответствующую запись в первой таблице?

ОБНОВЛЕНИЕ

Вот как я открываю БД:

bool ManagerDatabase::openDatabase(QString name)
{
    QString filename = qApp->applicationDirPath() + "/" + name + ".sqlite";
    if (!QFile::exists(filename)) return false;

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "dbData");
    db.setDatabaseName(filename);
    bool ret = db.open();
    if (ret) enableForeignKeys();
    return ret;
}

void ManagerDatabase::enableForeignKeys()
{
    QSqlQuery query(QSqlDatabase::database("dbData"));
    query.prepare("PRAGMA foreign_keys = ON;");
    query.exec();
}

1 Ответ

1 голос
/ 18 апреля 2020

... так как я установил флаг ON DELETE CASCADE, я ожидаю, что также должны быть удалены записи в таблице настроек с тем же pn ...

Вы неправильно поняли что делает ON DELETE CASCADE Вы должны ожидать, что если строка в settings будет удалена, то все строки в manufacturing, которые содержат ссылку на столбец pn удаленной строки в settings, также будут удалены, а не другим способом. около. Таким образом, удаления в родительской таблице каскадируются к таблицам, которые содержат ссылки на столбцы в этой родительской таблице. Вы можете найти больше здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...