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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Sql в Qt (конкретно SQLite)  (Прочитано 8171 раз)
Bepec
Гость
« : Февраль 25, 2013, 15:46 »

Уважаемые господа, ответьте на простой вопрос.

QSqlQuery поддерживает множественную вставку в таблицы? Или нет?

PS судя по моему бытию, не поддерживает, что очень странно. Или может есть какой обходной способ множественного добавления?
Записан
Странник
Гость
« Ответ #1 : Февраль 25, 2013, 15:53 »

Есть такой вариант.
Цитировать
bool QSqlQuery::execBatch ( BatchExecutionMode mode = ValuesAsRows )
Executes a previously prepared SQL query in a batch. All the bound parameters have to be lists of variants. If the database doesn't support batch executions, the driver will simulate it using conventional exec() calls.
Записан
Bepec
Гость
« Ответ #2 : Февраль 25, 2013, 17:50 »

Хм. печальненько что стандартный оператор не поддерживается. Попробую завтра с утреца (рабочий проект).

Огромное спасибо, даже и не подумал что функционал будет так спрятан.
Записан
carrygun
Гость
« Ответ #3 : Февраль 26, 2013, 05:08 »

execBatch() вроде бы не поддерживается ни одним из драйверов бд в Qt. Там в сырцах банальная циклическая вставка, как написано в описании.
Записан
Bepec
Гость
« Ответ #4 : Февраль 26, 2013, 05:57 »

Увидим попозже Веселый через часика полтора Веселый
Записан
Странник
Гость
« Ответ #5 : Февраль 26, 2013, 08:58 »

execBatch() вроде бы не поддерживается ни одним из драйверов бд в Qt. Там в сырцах банальная циклическая вставка, как написано в описании.
SQLITE не поддерживает, да. Но ни одним - это вы погорячились. Поддержка этой фичи есть, к примеру, у OCI. Других действительно не припомню.

Хм. печальненько что стандартный оператор не поддерживается. Попробую завтра с утреца (рабочий проект).
Стандартный - это уровня SQL? Тогда все определяется непосредственно SQLITE, QSqlQuery вообще никаким боком. Многострочный INSERT поддерживается SQLITE с версии что-то около 3.7.11. В моем Qt 5.0.1, к примеру, из коробки идет версия 3.7.7, так что пряники пока недоступны. Как вариант, если очень уж хочется, можно сделать грязный хак:
Код:
INSERT INTO tableName(col1, col2)
SELECT 'val1.1', 'val1.2'
UNION SELECT 'val2.1', 'val2.2'
UNION SELECT 'val3.1', 'val3.2'
Записан
Bepec
Гость
« Ответ #6 : Февраль 26, 2013, 09:08 »

Да, драйверы Qt для sqlite не поддерживают множественной вставки.

Приблизительное сравнение возможностей драйвера Qt и простого подключения библиотеки в проект.

Добавление 13000 хешей файлов:

QSqlQuery - 1760896 мс (29 минут)
sqlite3 - 146 мс(эээ... ноу минут)

PS а я то думал, что это sql такой тормозной Веселый


« Последнее редактирование: Февраль 26, 2013, 09:12 от Bepec » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Февраль 26, 2013, 09:19 »

Bepec, transaction юзал? Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #8 : Февраль 26, 2013, 09:25 »

Конечно. Все добавления шли в транзакции.  (в QSqlQuery)
В случае с sqlite транзакции не использовались. (недоработочка)

PS это пока первое впечатление, сейчас создам тестовый проектик на оба случая. А то мб действительность отличается Веселый
Записан
Странник
Гость
« Ответ #9 : Февраль 26, 2013, 09:26 »

советую погуглить на тему медленной вставки SQLITE, узнаете много нового.
Записан
Bepec
Гость
« Ответ #10 : Февраль 26, 2013, 09:54 »

Хм. А на чистом проекте показывает практически одинаковые результаты Веселый

Странно сие. Буду искать проблемку Улыбающийся

PS гуглил уже, включал различные режимы, отрубал журнал. Выигрыш был, но несущественный.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Февраль 26, 2013, 10:08 »

Мне для ускорения вставки помогло удаление всех индексов перед вставкой и создание их после.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
fuCtor
Гость
« Ответ #12 : Март 03, 2013, 10:39 »

Да, драйверы Qt для sqlite не поддерживают множественной вставки.

Приблизительное сравнение возможностей драйвера Qt и простого подключения библиотеки в проект.

Добавление 13000 хешей файлов:

QSqlQuery - 1760896 мс (29 минут)
sqlite3 - 146 мс(эээ... ноу минут)

PS а я то думал, что это sql такой тормозной Веселый




Какие-то нереальные цифры (если конечно не считаете хэши в реалтайме) о_О у себя перегон записей (14000 шт) из одной БД (Mysql) в Sqlite, пачками по 500шт (обернуто в одну транзакцию) c промежуточной обработкой, занимает 15-20сек. Тут больше затраты на сеть уходят, чем на sqlte.
Индексов нет, добавляются потом.
Записан
Bepec
Гость
« Ответ #13 : Март 03, 2013, 20:28 »

Да, у меня там был маленький просчёт в замерах. Улыбающийся

Но тем больше моя радость, когда был показан приятный результат Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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