我想使用Qt之类的.dump表,
源码> sqlite3 a.db" .dump" | sqlite3 b.db
我使用dump来恢复损坏的表或数据库。 但我想用Qt转储。 所以我制作了这段代码
mainDb = QSqlDatabase::addDatabase( "QSQLITE" , "first" );
mainDb.setDatabaseName( "main.db" );
mainDb.open();
copyDb = QSqlDatabase::addDatabase( "QSQLITE" , "second" );
copyDb.setDatabaseName( "copy.db" );
copyDb.open();
QSqlQuery mainQuery( mainDb );
QSqlQuery subQuery( copyDb );
bool ret = subQuery.exec( "create table contents_list("
"id varchar(128) primary key not null,"
"data varchar(2048) );" );
if( !ret )
{
qDebug() << subQuery.lastError().text();
}
static const QString QUERYFORMAT( "INSERT INTO CONTENTS_LIST( id, data ) VALUES( '%1' , '%2' )" );
mainQuery.exec( "select * from contents_list" );
QSqlRecord rec = mainQuery.record();
QString id, data;
QString queryString;
while( mainQuery.next() )
{
id = mainQuery.value( rec.indexOf( "id" ) ).toString();
data = mainQuery.value( rec.indexOf( "data" ) ).toString();
qDebug() << id << " " << data ;
queryString = QUERYFORMAT.arg( id, data );
ret = subQuery.exec( queryString );
if( !ret )
{
qDebug() << subQuery.lastError().text();
}
}
mainQuery.exec( "delete from contents_list" );
subQuery.exec( "select * from contents_list" );
rec = subQuery.record();
while( subQuery.next() )
{
id = subQuery.value( rec.indexOf( "id" ) ).toString();
data = subQuery.value( rec.indexOf( "data" ) ).toString();
qDebug() << id << " " << data ;
queryString = QUERYFORMAT.arg( id, data );
ret = mainQuery.exec( queryString );
if( !ret )
{
qDebug() << mainQuery.lastError().text();
}
}
subQuery.exec( "drop table contents_list" );
mainDb.close();
copyDb.close();
此代码正常工作,但当记录数超过10000~时,运行时间非常长。 如何减少运行时间或其他方式来恢复损坏的数据库。
对不起我的英语技能。
感谢。
答案 0 :(得分:1)
QSqlQuery subQuery( copyDb );
之后添加:
mainQuery.exec("BEGIN;");
subQuery.exec("BEGIN;");
在mainDb.close();
之前添加:
mainQuery.exec("COMMIT;");
subQuery.exec("COMMIT;");