Qt之Sqlite insert 方法对比

在台式机上测试Sqlite不同插入方案对比发现:select-stmt是插入速度最快的方式,事务虽然也能加快插入数据,相较于STMT还是慢了不少。
通过如下测试发现STMT方式可能是最适合大批插入的方式

#include <QCoreApplication>

#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlDriver>
#include <QSqlError>
#include <QDateTime>
#include <QDebug>

class SqlInsert
{
public:
    SqlInsert()
    {
        db = QSqlDatabase::addDatabase("QSQLITE","InsertAction");
        db.setDatabaseName("InsertOP.db");
        db.open();
        QSqlQuery query(db);
        query.exec("create table TestTable (id INTEGER PRIMARY KEY"
                   ", Datetime varchar(30), System varchar(10),"
                   "Type varchar(10), MainItem varchar(20),"
                   "SubItem varchar(20), Result varchar(20))");
    }
    virtual ~SqlInsert()
    {
        db.close();
        db.removeDatabase("SqlThread");
    }
    // 直接插入
    void insertbynormalway()
    {
        QSqlQuery query(QSqlDatabase::database("InsertAction"));
        for(int i = 0; i < 100; i++)
        {
            query.exec("insert into TestTable(Datetime, System, Type, MainItem, SubItem, Result)values('2021-05-09 18:19:12','A','1','2','3','4')");
        }
    }
    // STMT插入
    void insertbystmtway()
    {
         QSqlQuery query(QSqlDatabase::database("InsertAction"));
         QString strDateTime = QDate::currentDate().toString("yyyy-MM-dd ") + QTime::currentTime().toString("hh:mm:ss.zzz");
         QString strSystem = "A";
         QString strEb = "INSERT INTO TestTable SELECT " \
                        + QString::number(0) + "AS 'id','" \
                        + strDateTime + "'AS 'Datetime','" \
                        + strSystem +"'AS 'System','" \
                        + QString::number(1) + "'AS 'Type', '" \
                        + QString::number(2) + "'AS 'MainItem', '"  \
                        + QString::number(3) + "'AS 'SubItem', '" \
                        + QString::number(4) + "'AS 'Result'";
         QString strunionEb = "";
         for (int i = 1; i < 100; i++)
         {
             strunionEb = "UNION ALL SELECT " \
                          + QString::number(i) + ",'" \
                          + strDateTime + "','" \
                          + strSystem + "','" \
                          + QString::number(1) + "','" \
                          + QString::number(2) + "','" \
                          + QString::number(3) + "','" \
                          + QString::number(4) + "' ";
             strEb = strEb + strunionEb;
         }
         query.exec(strEb);
    }
    // 事务插入
    void insertbytransaction()
    {
        QSqlQuery query(QSqlDatabase::database("InsertAction"));
        if(db.driver()->hasFeature(QSqlDriver::Transactions))
        {//支持事务操作
            if(db.transaction())/// 开启事务
            {
                bool retval = true;
                query.setForwardOnly(true);
                query.prepare("insert into TestTable(Datetime, System, Type, MainItem, SubItem, Result)values(:datetime,:system,:type,:mainItem,:subItem,:result)");
                for(int i = 0; i < 100;i++ )
                {
                    QString strDateTime = QDate::currentDate().toString("yyyy-MM-dd ") + QTime::currentTime().toString("hh:mm:ss.zzz");
                    QString strSystem = "A";
                    query.bindValue(":datetime",strDateTime);
                    query.bindValue(":system",strSystem);
                    query.bindValue(":type",QString::number(1));
                    query.bindValue(":mainItem",QString::number(2));
                    query.bindValue(":subItem",QString::number(3));
                    query.bindValue(":result",QString::number(4));
                    retval &= query.exec();
                }
                if(retval)
                {
                    if(!db.commit())
                    {
                        qDebug() << QString("%1[%2 LineNo:%3]Database Commit Failed,Cause:%4")\
                                    .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"))\
                                    .arg(__FUNCTION__).arg(__LINE__).arg(db.lastError().databaseText());
                    }
                }
                else
                {
                    if(!db.rollback())//如果提交失败则回滚
                    {
                        qDebug() << QString("%1[%2 LineNo:%3]Database Rollback Failed,Cause:%4")\
                                    .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"))\
                                    .arg(__FUNCTION__).arg(__LINE__).arg(db.lastError().databaseText());
                    }
                }
            }
            else
            {
                qDebug() << QString("%1[%2 LineNo:%3]Database Transaction Failed,Cause:%4")\
                            .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"))\
                            .arg(__FUNCTION__).arg(__LINE__).arg(db.lastError().databaseText());
            }
        }
        else
        {
            qDebug() << QString("Database cannot support transaction function");
        }
    }
    void CleanTableContent()
    {
        QSqlQuery query(QSqlDatabase::database("InsertAction"));
        query.exec("DELETE FROM TestTable");
    }
private:
     QSqlDatabase db;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    SqlInsert work;
    {
        QDateTime CurrentTime1 = QDateTime::currentDateTime();
        work.insertbynormalway();
        QDateTime CurrentTime2 = QDateTime::currentDateTime();
        int32_t ms = CurrentTime1.msecsTo(CurrentTime2);
        qDebug() << QString("normal way insert action takes time:%1").arg(ms);
        work.CleanTableContent();
    }
    {
        QDateTime CurrentTime1 = QDateTime::currentDateTime();
        work.insertbystmtway();
        QDateTime CurrentTime2 = QDateTime::currentDateTime();
        int32_t ms = CurrentTime1.msecsTo(CurrentTime2);
        qDebug() << QString("stmt way insert action takes time:%1").arg(ms);
        work.CleanTableContent();
    }
    {
        QDateTime CurrentTime1 = QDateTime::currentDateTime();
        work.insertbytransaction();
        QDateTime CurrentTime2 = QDateTime::currentDateTime();
        int32_t ms = CurrentTime1.msecsTo(CurrentTime2);
        qDebug() << QString("transaction way insert action takes time:%1").arg(ms);
    }
    return a.exec();
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLiteQt自带驱动)。在Qt中操作SQLite需要引入SQL模块,在Qt项目文件(.pro文件)中,加入SQL模块:QT += sql。在需要使用SQL的类定义中,引用相关头文件,例如:#include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery>。建立数据库可以使用QSqlDatabase类,使用QSqlQuery类执行SQL语句。在执行SQL语句时,成功执行的SQL语句将查询的状态设置为活动状态,以便isActive()返回true。否则,查询的状态将设置为非活动状态。在任何一种情况下,执行新的SQL语句时,查询都位于无效记录上。必须先将活动查询导航到有效记录(以便isActive()返回true),然后才能检索值。具体操作可以参考以下代码: //建立数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("mydatabase.db"); if (!db.open()) { qDebug() << "Failed to connect to database."; return; } //创建表 const QString sql=R"( CREATE TABLE IF NOT EXISTS my_table ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name CHAR (50) UNIQUE NOT NULL, age INTEGER );)"; QSqlQuery query; if(query.exec(sql)){ qDebug()<<"init table success"; }else{ qDebug()<<"init table error"<<query.lastError(); } //插入数据 QString name = "Tom"; int age = 20; QString insertSql = QString("INSERT INTO my_table (name, age) VALUES ('%1', %2)").arg(name).arg(age); if(query.exec(insertSql)){ qDebug()<<"insert data success"; }else{ qDebug()<<"insert data error"<<query.lastError(); } //查询数据 QString selectSql = "SELECT * FROM my_table"; if(query.exec(selectSql)){ while(query.next()){ int id = query.value(0).toInt(); QString name = query.value(1).toString(); int age = query.value(2).toInt(); qDebug()<<id<<name<<age; } }else{ qDebug()<<"select data error"<<query.lastError(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值