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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: sqlite и qt  (Прочитано 8311 раз)
Dastes
Гость
« : Апрель 16, 2012, 18:49 »

Вставка в таблицу 1361 записи занимает ~130 секунд.  Пробовал перебирать циклом и пакетным запросом.
Можно ли как-нибудь ускорить это дело?

Код:
void Transactions::putData(QStringList data, QString name)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
    db.setDatabaseName( "data.db" );
    db.open();
    
    
    //   QSqlQuery qry;
    
    //   qry.prepare( "CREATE TABLE "+name+" (id INTEGER PRIMARY KEY AUTOINCREMENT, val VARCHAR(10))" );
    //   qry.exec();
    
    //   for(int i=0; i<data.size();++i)
    //   {
    //   QString val=data.at(i);
    //   qry.prepare( "INSERT INTO "+name+" (val) VALUES ('"+val+"')" );
    //   qry.exec();
    //   }
    
    
    
    
    QSqlQuery qry;
    
    qry.prepare( "CREATE TABLE "+name+" (id INTEGER PRIMARY KEY AUTOINCREMENT, val VARCHAR(10))" );
    qry.exec();

    qry.prepare( "INSERT INTO "+name+" (val) VALUES (?)" );

    QVariantList names;
    for(int i=0; i<data.size();++i) names.append(data.at(i));

    qry.addBindValue(names);
    qry.execBatch();
    
    db.close();
}
Записан
DmP
Гость
« Ответ #1 : Апрель 16, 2012, 19:05 »

Может транзакция поможет?
Записан
Dastes
Гость
« Ответ #2 : Апрель 16, 2012, 19:09 »

В справке по QSqlQuery о транзакциях ни слова не нашел.
Ты бы пример привел.
Записан
Dastes
Гость
« Ответ #3 : Апрель 16, 2012, 19:24 »

Все. Вопрос решен.
Правда помогла транзакция. Заполняется таблица незаметно быстро. Оказывается это относится к  QSqlDatabase.
Записан
JayFOX
Гость
« Ответ #4 : Апрель 16, 2012, 22:31 »

На MySQL прирост скорости значительный, если внести в один запрос вида
Код:
INSERT INTO table(val) VALUES(...), (...) ...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #5 : Апрель 17, 2012, 09:46 »

Замечание, ты неверно используешь prepare. Почитай в ассистенте, как правильно нужно.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
UNION labs
Гость
« Ответ #6 : Апрель 18, 2012, 11:50 »

Транзакция решает!

Код:
void Transactions::putData(QStringList data, QString name)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
    db.setDatabaseName( "data.db" );
    db.open();

    db.transaction();
    // вставка сколько угодно строк
    db.commit();
    
    db.close();
}

Вот нашел даже такое сравнение скорости http://www.sqlite.org/speed.html
« Последнее редактирование: Апрель 18, 2012, 11:52 от dimkanovikov » Записан
Dastes
Гость
« Ответ #7 : Апрель 18, 2012, 11:56 »

Транзакция решает!

Код:
void Transactions::putData(QStringList data, QString name)
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
    db.setDatabaseName( "data.db" );
    db.open();

    db.transaction();
    // вставка сколько угодно строк
    db.commit();
    
    db.close();
}

Вот нашел даже такое сравнение скорости http://www.sqlite.org/speed.html
Так и сделал!
Только не пойму почему пакетный запрос не канает. Судя по логике он должен все за один раз туда отправить, а на практике выполняется так же долго как и простыми запросами через цикл.
Записан
UNION labs
Гость
« Ответ #8 : Апрель 18, 2012, 12:06 »

Только не пойму почему пакетный запрос не канает. Судя по логике он должен все за один раз туда отправить, а на практике выполняется так же долго как и простыми запросами через цикл.

Что вы подразумеваете под пакетным запросом?
Записан
Dastes
Гость
« Ответ #9 : Апрель 18, 2012, 12:10 »

Только не пойму почему пакетный запрос не канает. Судя по логике он должен все за один раз туда отправить, а на практике выполняется так же долго как и простыми запросами через цикл.

Что вы подразумеваете под пакетным запросом?

http://qt-project.org/doc/qt-4.8/qsqlquery.html#execBatch
Записан
UNION labs
Гость
« Ответ #10 : Апрель 18, 2012, 12:20 »

Ага понял, не внимательно прочитал ваш первый пост.

На самом деле все просто

Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
QSqlDriver * driver = db.driver();
qDebug() << driver->hasFeature( QSqlDriver::BatchOperations ); // false

SQLite просто не поддерживает данной возможности!
Записан
Dastes
Гость
« Ответ #11 : Апрель 21, 2012, 22:13 »

Возникла еще проблема:
Установил чистый xp на виртуальную машину.
Скопировал туда программу.
Она запускается нормально, но список QComboBox, который заполняется данными из запроса к Sqlite, пуст. Никаких ошибок не выдает.

В чем может быть дело?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #12 : Апрель 22, 2012, 00:10 »

dll не взяли, а ошибки нет, потому, что при открытии и запросах не проверяете успешность этих операций и не выводите ошибку при неудаче.
Записан
Dastes
Гость
« Ответ #13 : Апрель 22, 2012, 00:21 »

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


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