T
TempestSong10 сентября 2017 г. 6:16

QSqlTableModel UNIQUE constraint

QSqlTableModel, UNIQUE

Здравствуйте!

Есть файл базы данных встраиваемой SQLite3. В нем несколько таблиц, которые отображаются в QSqlTableModel модели. Заказчику оказалось неудобно редактировать и добавлять записи прямо в QTableView, поэтому пришлось писать под каждую модельку отдельный модальный диалог добавления/редактирования данных и потом уже данные из этого диалога отправлять в модельку.
И тут обнаружилось, что insertRecord(), которым я пользуюсь для вставки данных в случае добавления записи (не редактирования!), не кидает код ошибки на самый верх в клиентский код (то есть, мой код), если при попытке добавления обнаруживаются дубликаты и происходит нарушение ограничения UNIQUE по столбцам. В итоге данные наполовину добавляются в модель, но не добавляются в файл базы по причине того, что db-движок-то нарушения UNIQUE проверяет чётко и не пропускает невалидные относительно ограничений записи. На скриншоте ниже можно увидеть кривую полу-добавленную запись с отсутствующим автоматически сгенерированным базой ID.
https://s20.postimg.org/4qy56hwz1/image.png - ссылка на скриншот
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

3
Evgenii Legotckoi
  • 11 сентября 2017 г. 15:19
  • Ответ был помечен как решение.

Добрый день!
insertRecord() должна возвращать в случае неудачи false, а жанные в таблицу не должны добавляться теоретически.
Вообще я вручную проверял наличие существующей записи, а уж потом делал добавление новой информации в таблицу.
Проверку делал через SELECT . Хотя это может быть и не совсем правильный подход.

    T
    • 11 сентября 2017 г. 21:14

    Спасибо, буду иметь в виду Ваш подход. Но, промучившись вечер, решил задачу, пардон, по-быдлокодерски - через QSqlQuery делал запросы INSERT OR IGNORE , UPDATE OR IGNORE напрямую в таблицу, а потом перезагружал модель через select() . Я получил то, что хотел - при попытке провести операцию, приводящую к нарушению ограничений, движок базы данных выполняет sql-запрос "вхолостую". Но огромный минус такого подхода - феерическая дыра в безопасности, связанная с SQL-инъекциями. Пока не придумал, как это исправить.

      Evgenii Legotckoi
      • 12 сентября 2017 г. 1:29

      Думаю, что Ваш костыль несколько правильнее моего будет ))

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        AD

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:50баллов,
        • Очки рейтинга-4
        m
        • molni99
        • 26 октября 2024 г. 1:37

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:80баллов,
        • Очки рейтинга4
        m
        • molni99
        • 26 октября 2024 г. 1:29

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:20баллов,
        • Очки рейтинга-10
        Последние комментарии
        ИМ
        Игорь Максимов22 ноября 2024 г. 11:51
        Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii Legotckoi31 октября 2024 г. 14:37
        Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZE19 октября 2024 г. 8:19
        Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов5 октября 2024 г. 7:51
        Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas55 июля 2024 г. 11:02
        QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Сейчас обсуждают на форуме
        m
        moogo22 ноября 2024 г. 7:17
        Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
        Evgenii Legotckoi
        Evgenii Legotckoi24 июня 2024 г. 15:11
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey115 ноября 2024 г. 6:04
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProject4 июня 2022 г. 3:49
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

        Следите за нами в социальных сетях