从QSqlTableModel获取数据并放入QVector<QPointF>的最快方法

Fastest way to get data from QSqlTableModel and put in QVector<QPointF>

本文关键字:gt QPointF 方法 QSqlTableModel lt 数据 QVector 获取      更新时间:2023-10-16

我需要从QSqlTableModel中复制两列,并将其放入QVector中。

我正在尝试这个:

ParameterData pd;
QSqlTableModel *m = mapTbModels.value(table);
QList<QSqlField> parameterList = getFields(table);
for (int j = 0; j <parameterList.size(); j++) {
    QSqlField f = parameterList[j];
    QVector<QPointF> v;
    if (f.type() != QVariant::Int)
        continue;
    else {
        pd.name = f.name();
        timer.start();
        for (int i = 0; i < m->rowCount(); i++)
            v << value(m, i, f.name());
        qDebug() << "Database" << timer.elapsed();
    }
    pd.data = v;
    pd.table = table;
    emit data(pd);
    emit status(QString::number(j*100/parameterList.size()));
    QCoreApplication::processEvents();
}

最快的路是什么?

我曾经用Qt 5.2和postgres进行过一些性能测试,以检查qsql的特性。事实证明,使用QSqlTableModel比使用自己的SQL查询(如)慢大约1000倍

    QSqlQuery query("",db);
    query.prepare("SELECT a.fueltype_longname, coalesce(a.bunkerlog_amount,0) FROM (
                SELECT f.fueltype_longname, b.bunkerlog_amount, rank() OVER (PARTITION BY b.bunkerlog_fueltype ORDER BY b.bunkerlog_id DESC) FROM data.t_bunkerlog2 b
                RIGHT JOIN data.t_fueltype f ON b.bunkerlog_fueltype = f.fueltype_longname  
      ) a WHERE a.rank=1");
     query.exec();

因此,对于数据密集型应用程序,请使用query/prepare/exec。如果您只想向用户显示简单的表,请使用QSqlTableModel等以方便使用。