QSqlTableModel使用-批量插入数据
一般数据量小的时候使用insert命令直接插入数据, 但insert命令效率比较低,数据量大了就不适用了(测试插入6000条数据需要63s,每条约105ms)
下面测试用QSqlTableModel向数据库插入6000条数据,每条数据大约70Byte,并测试所用时间
//sql_tt是已经创建好的数据库文件,并且已经打开了,
//sql_tt里面包含表tttt,表内容如下
//date int , time int, p_id int, c_id int, value varchar(20), info varchar(60)
QSqlTableModel * md_test = new QSqlTableModel(0, sql_tt);
//设置 数据需要提交后才能写入数据库
md_test->setEditStrategy(QSqlTableModel::OnManualSubmit);
md_test->setTable("tttt");//将model绑定到数据库sql_tt中的表tttt上
md_test->select();
while (md_test->canFetchMore())//这个while解决只能读取256行的问题
md_test->fetchMore();
int maxcount = md_test->rowCount();//总条数
qDebug()<<QTime::currentTime();//第一次打印时间
int rowcount = 6000;
if(md_test->insertRows(maxcount,rowcount))//向model插入6000行,这时每行还没有内容
qDebug("insertRows ok");
else
qDebug("insertRows failed");
//设置每行的内容
for(int i=0; i<rowcount; i++)
{
md_test->setData(md_test->index(maxcount+i,0),maxcount+i);
md_test->setData(md_test->index(maxcount+i,1),87654321);
md_test->setData(md_test->index(maxcount+i,2),1);
md_test->setData(md_test->index(maxcount+i,3),12);
md_test->setData(md_test->index(maxcount+i,4),"1.2345");
md_test->setData(md_test->index(maxcount+i,5),"Rack#22;Pack#55;cell#66;Voltage=34.5678V");
}
md_test->database().transaction();//开始事务操作
if(md_test->submitAll())//提交操作
{
qDebug("submitAll ok");
md_test->database().commit();//提交 这个提交和上面的提交有什么关系?
//此时model中的内容已经插入到数据了
}
else
qDebug("submitAll failed");
qDebug()<<QTime::currentTime();//第二次打印时间
程序运行后打印结果如下
QTime(“11:11:33.319”)
insertRows ok
submitAll ok
QTime(“11:11:42.978”)
两次打印的时间差为9668ms,计算得每条数据约1.6ms
当然,插入时间是跟主机配置相关的,上面的数据是电脑上运行的速度,在arm上实测速度约为3.16ms/条