Как четко указано в документации Qt для QSqlQuery :: prepare () и QSqlQuery :: exec () ,
Для SQLite запросСтрока может содержать только одну инструкцию за раз.Если дано более одного оператора, функция возвращает false.
Как вы уже догадались, единственный известный обходной путь к этому ограничению состоит в том, чтобы все операторы sql были разделены некоторой строкой, разделить операторы и выполнитькаждый из них в цикле.
См. следующий пример кода (который использует ";" в качестве разделителя и предполагает, что тот же символ не используется в запросах ... в этом не хватает универсальности, поскольку вы можете иметьсимвол в строковых литералах в операторах where / insert / update):
QSqlDatabase database;
QSqlQuery query(database);
QFile scriptFile("/path/to/your/script.sql");
if (scriptFile.open(QIODevice::ReadOnly))
{
// The SQLite driver executes only a single (the first) query in the QSqlQuery
// if the script contains more queries, it needs to be splitted.
QStringList scriptQueries = QTextStream(&scriptFile).readAll().split(';');
foreach (QString queryTxt, scriptQueries)
{
if (queryTxt.trimmed().isEmpty()) {
continue;
}
if (!query.exec(queryTxt))
{
qFatal(QString("One of the query failed to execute."
" Error detail: " + query.lastError().text()).toLocal8Bit());
}
query.finish();
}
}