我有一个包含几个SQL语句的文件,我想用它来初始化一个新的sqlite3数据库文件.显然,sqlite3只通过 sqlite3_exec()
函数处理一个查询中的多个语句,而不是通过prepare/step/finalize
函数处理.这一切都很好,但我想直接使用QtSQL api而不是c api.通过QSqlQuery加载到相同的初始化文件中只执行第一个语句,就像直接使用sqlite3 api中的prepare/step/finalize函数一样.有没有办法让QSqlQuery运行多个查询,而无需为每个语句单独调用query.exec()?
正如Qt Documentation for QSqlQuery :: prepare()和QSqlQuery :: exec()中明确指出的那样,
对于SQLite,查询字符串一次只能包含一个语句.如果给出多个语句,则该函数返回false.
正如您已经猜到的,这个限制的唯一已知解决方法是将所有sql语句用一些字符串分隔,拆分语句并在循环中执行每个语句.
请参阅以下示例代码(使用";"作为分隔符,并假设在查询中未使用相同的字符.这缺乏一般性,因为您可能在/ 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(); } }