Search
Write a publication
Pull to refresh

Comments 9

Мне кажется у вас просто перепечатка справки. Которая многократно была переведена в версии 4.х.х.
И совет ваш очень вредный, ибо будет «тормозить» просто безбожно.
каждая имеет связь с предыдущей с помощью foreign key через id, т.е. при удалении необходимо каскадно удалять все «дочерние» записи. Это приводит к огромному количеству запросов, работа приложения сильно замедляется...

В SQLite можно настроить автоматическое каскадное удаление по foreign key, так что одного sql-запроса достаточно. Даже, если бы такого не было, то никакая дополнительная абстракция не поможет избежать выполнения нужного числа запросов.
Использовал QSqlRelationalTableModel в проекте на работе 9 лет назад, всё устраивало, пока не вышла Qt 4.8, в которой что-то сломали — подозреваю, специально, — и приложение стало падать, если на месте связи значение NULL. Также не работает на view по причине отсутствия у них первичного ключа. В общем, за последние 9 лет мне ни разу не пригодился этот класс в моих проектах, QSqlTableModel + view с правилами на изменение намного удобнее, хотя и приходится писать небольшую обвязку для делегатов.

Первый способ крайне опасный, если вы не пишите приложение чисто для себя. Привет sql инъекции. Допускаю, что вы код накидали чисто для примера, но в любом случае не стоит так делать.

Этот код я привёл только для примера, никого так делать не призываю, это опасно с точки зрения инъекций. К тому же, есть немного более лаконичный способ с bindValue().

Приветствую всех, в QSqlRelationalTableModel мне не нравится несколько моментов (Qt 4.8) , используем с QTableView к примеру:

  1. Вы добавляете новую строку, устанавливаете значение (какой-то текст) relation поля, все Гут. Сохраняете строку (submit, select) и что получаете? Пустое значение в поле.

Попробуйте 4.7. Насколько я помню, в 4.8 этот класс был сломан.

Можно конечно попробовать 4.7. Но смысл? Мое мнение, что троли не доделали развитие QSqlRelationalTableModel на тот момент, когда продали права на Qt. А потом никому не надо было ничего развивать. Поэтому я просто сделал свое развитие PblSqlTableModel и сделал как я это вижу (у меня есть об этом свободном проекте статья на хабре)

Переименовали свои классы в QpSqlRelationalTableModel, т.е. с префиксом Qp.

Используем в коммерческом проекте несколько лет, все в целом устраивает, понемногу допиливаем/шлифуем функционал.

Идея нашего QpSqlRelationalTableModel в том, чтобы в select запросе добавлялось ещё и значение int id внешней связи, кроме тестового представления.

В QpTableView int id визуально скрывается, так что для пользователя ничего внешне не меняется.

Зато это int id теперь у нас всегда под рукой. Он нужен например при копировании строки. Потом когда вы хотите открыть источник тестового представления (т.е. внешнюю таблицу) с позиционированием на элементе с нашим id.

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

Sign up to leave a comment.

Articles