Russian Qt Forum
Октябрь 01, 2024, 16:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Удаление записей в SQLite, имеющих child records  (Прочитано 21074 раз)
carlos13
Гость
« : Октябрь 27, 2009, 20:41 »

Из таблицы пытаюсь удалить запись (delete from ...) - получаю constraint violation, что есть гуд, т.к. foreign key. Причем удаляю из под программы SQLite Expert 2.2.7 (визуальный тул для администрирования SQLite).

Если пытаюсь удалить ту же запись из своей проги, писаной на Qt (sdk v2009.04), таким макаром:
            QSqlQuery delRn ("delete from kind where nRn = " + id);
            delRn.exec();
то запись удаляется, чего быть НЕ ДОЛЖНО!!!

В чем косяк и как его поправить?
« Последнее редактирование: Октябрь 27, 2009, 21:00 от carlos13 » Записан
carlos13
Гость
« Ответ #1 : Октябрь 27, 2009, 22:20 »

Ситуация прояснилась. В этой проге используется новый драйвер, поддерживающий foreign key constraints.
Скачал исходники, содержащий файлы с расширением h и c.
Как мне теперь собрать драйвер? Если можно, дайте пошаговую инструкцию - что в какую папку положить, откуда и какие команды выполнить.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #2 : Октябрь 28, 2009, 00:46 »

Вообще все это весьма странно ведь если вы создали таблицу со вторичным ключом и on deleted = no action или restricted - то вроде как сервер не должен давать удалить соответствующую запись - и без разницы откуда вызывается запрос из Admin-программы или Qt. Причем для SQLite который не клиент-серверный это тоже должно быть верно ведь все равно какая программы делает запрос - всю работу то выполняют библиотеки SQLite.

Цитировать
Ситуация прояснилась. В этой проге используется новый драйвер, поддерживающий foreign key constraints.
А есть ссылка на этот материал? - как Qt драйвер может  поддерживать foreign key если это дело сервера БД, мне кажется драйвер лишь должен получить ответ от сервера, а не проверять вторичные ключи и т.д.
Записан
carlos13
Гость
« Ответ #3 : Октябрь 28, 2009, 08:41 »

Тогда выходит, что админский тулз и Qt используют разные версии библиотек SQLite (СУБД ведь не серверная), т.к. возможность некорректно удалить запись имеется.

Мне не хватает знаний на тему, что скачать по ссылке http://www.sqlite.org/releaselog/3_6_19.html и куда это подпихнуть в Qt, чтоб моя прога юзала последнюю версию библиотеки SQLite.

Сто пудово проблема в библиотеке (это я ее выше неправильно драйвером обозвал). Ведь корректно, например, отрабатываются уникью констрейнты, а форин кеи нет. А именно в последней версии SQLite включена поддержка форин кеев.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #4 : Октябрь 28, 2009, 09:29 »

Цитировать
Мне не хватает знаний на тему, что скачать по ссылке http://www.sqlite.org/releaselog/3_6_19.html и куда это подпихнуть в Qt, чтоб моя прога юзала последнюю версию библиотеки SQLite.

Попробуй снести все версии SQLite из системы а потом поставить последнюю - и заставить программу работать - я так понимаю SQLite библиотеки под виндой копируются куда - то типа Windows/System32 и драйвер SQLite Qt их оттуда берет во время работы программы.
Записан
BaltikS
Гость
« Ответ #5 : Октябрь 28, 2009, 10:46 »

carlos13, правильно так и должно быть.
break, Я всегда думал что sqlite никак не относится к ОС и представляет собой файл(ы), в которых собственно и хранится сама База. Qt к этому файлу обращается напрямую. Вот через это src\3rdparty\sqlite.
carlos13, Поэтому изменить возможности связанные с Foreign Key думаю возможны лишь через написание собственного драйвера!
« Последнее редактирование: Октябрь 28, 2009, 10:54 от BaltikS » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Октябрь 28, 2009, 11:11 »

Цитировать
Я всегда думал что sqlite никак не относится к ОС и представляет собой файл(ы), в которых собственно и хранится сама База.

Ну я так не думаю база это база а механизм работы с ней это программа (сервер БД пусть даже супер эмбеддед) - которая лежит в отдельной библиотеке.

Цитировать
Вот через это src\3rdparty\sqlite.
Это и есть исходник библиотеки SQLite который и для винды и для Linux можно скачать в бинарном (скомпиленном) виде, а вот действительно ли Qt использует этот бинарник (компиляет его из src ) или он ей нужен только как набор хедеров я не в курсе. Наверное при сборке Qt есть какие то ключи через которое это управляется.

А не может быть такого что SQLite Expert 2.2.7 сам проверяет FK - и нет никакой путаницы с библиотеками SQLite?
« Последнее редактирование: Октябрь 28, 2009, 11:14 от break » Записан
BaltikS
Гость
« Ответ #7 : Октябрь 28, 2009, 11:31 »

А не может быть такого что SQLite Expert 2.2.7 сам проверяет FK - и нет никакой путаницы с библиотеками SQLite?
Спрашивается, нафига тогда нужны внешние ключи?
Вот выдержки из документации по SQLite
Код:
This document describes the support for SQL foreign key constraints introduced in SQLite version 3.6.19. 
А вот выдержка из файла sqlite3.h в Qt
Код:
SQLITE_VERSION         "3.5.9"
Да и вообще версия 2.2.7 SQLite Manager вышла 26 октября, а поддержка SQLite-ом Foreign Key появилась только 14 октября. В связи с этим можно сделать вывод, что поддержка внешних ключей будет возможно только в новых версиях Qt.
Записан
carlos13
Гость
« Ответ #8 : Октябрь 28, 2009, 12:11 »

Еще раз в хронологическом порядке:
Задача: Нужно было создать базу на SQLite и нарисовать там -тцать табличек.

Для этого скачал прогу SQLite Expert 2.2.6(шесть!) - визуальный тулз для работы с БД.
Создал пустую базу. Это, условно говоря, обыкновенный файл. Роль СУБД, насколько понимаю играет SQL Library - sqllite3.dll. В программе она версии 3.6.18(восемнадцать). Именно эта dll позволяет работать с файлом и манипулировать данными и ограничена эта возможность функциональностью ЭТОЙ версии dll. В этой версии dll - форин кеи НЕ ПОДДЕРЖИВАЛИСЬ! И я реализовал структуру БД без них, но закладывая в голове их реализацию на Qt/с++.

Когда на сайте SQLite увидел, что вышла новая sqllite3.dll 3.6.19(девятнадцать) и она позволяет реализовывать форин кеи, - зашел на сайт SQLite Expert и скачал обновленную прогу версии 2.2.7(семь!). Обновление состояла именно в том, что SQLite Expert использовала новую dll и появилось несколько окошек для визуального создания этих форин кеев, чем я незамедлительно воспользовался. Всё.

Дальше выяснил, саму проблему - ёё уже описал.

Предполагаю, что и Qt использует sqllite3.dll в том или ином виде, но на момент выхода QT-шного релиза в этой dll НЕ ПОДДЕРЖИВАЛИСЬ форин кеи.

T.к. в Qt я ноль, прошу помощи в следующем:
 Есть исходные данные по sqllite3.dll 3.6.19(девятнадцать) - http://www.sqlite.org/releaselog/3_6_19.html
 И мне надо сделать, что бы Qt работала именно с этой версией библиотеки. Как это сделать?!
Записан
BaltikS
Гость
« Ответ #9 : Октябрь 28, 2009, 12:17 »

Написать свой драйвер QT, использующий sqllite3.dll 3.6.19(девятнадцать)
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #10 : Октябрь 28, 2009, 15:12 »

Цитировать
Написать свой драйвер QT, использующий sqllite3.dll 3.6.19(девятнадцать)
А если попробовать просто перекомпилировать с ней?
Записан
BaltikS
Гость
« Ответ #11 : Октябрь 28, 2009, 17:56 »

Попробовать можно и в приниципе даже должно получиться... Но это будет нарушением лицензии. Хотя, сейчас в Qt самопальные исправления многие делают.
Записан
carlos13
Гость
« Ответ #12 : Октябрь 29, 2009, 08:27 »

BaltikS, а что для этого сделать надо, распиши пожалуйста, я попробую, мне однако надо )
Записан
BaltikS
Гость
« Ответ #13 : Октябрь 29, 2009, 10:40 »

Я SqlLite не собирал сам, но полагаю если скачать исходники и поместить в папку src\3rdparty\sqlite, заменив существующие, и пересобрать драйвер SQLITE, то теоретически должно заработать
Записан
DmP
Гость
« Ответ #14 : Октябрь 29, 2009, 12:10 »

С сайта sqlite.org надо скачать sqlite-amalgamation.
И заодно глянуть на файлик в Qt src\3rdparty\patches\sqlite-3.5.6-config.patch, может пригодится.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.168 секунд. Запросов: 23.