QSqlQuery 忽略 SQLite DB 的排序顺序

Posted

技术标签:

【中文标题】QSqlQuery 忽略 SQLite DB 的排序顺序【英文标题】:QSqlQuery ignoring sort order for SQLite DB 【发布时间】:2014-11-16 23:04:13 【问题描述】:

我的QSqlQuery返回的结果总是相同的顺序,不管ORDER BY状态如何:

void Sy_loggingModel::reload()

    auto query = d_->buildQuery();
    query.setForwardOnly( true );
    if ( !query.exec() ) 
        throw Sy_exception( QObject::tr( "Failed to query logging data: " ) +
                            query.lastError().text() );
    

    beginResetModel();

    qDebug() << query.lastQuery()
             << d_->filter_        // First ? param
             << d_->sortedColumn_; // Second ? param

    d_->entries_.clear();
    while ( query.next() ) 
        auto timestamp = query.value( 1 ).toLongLong();
        auto level = query.value( 2 ).toInt();

        d_->entries_ << Sy_loggingModel_d::Entry
                            query.value( 0 ).toLongLong(),
                            QDateTime::fromMSecsSinceEpoch( timestamp ).toString(),
                            static_cast< Sy_loggerInterface::DebugLevel >( level ),
                            query.value( 3 ).toString() ;

        qDebug() << "\t" << query.value( 0 ).toLongLong()
                         << timestamp
                         << level
                         << query.value( 3 ).toString();
    

    endResetModel();

在排序顺序交替时产生此输出:

"SELECT rowid, timestamp, debugLevel, message FROM Sy_logger WHERE rowid >= ? AND debugLevel IN ( 0, 1, 2 ) ORDER BY ? DESC;" 0 1
     1 1415399097350 0 "Opened database ./logs/Syren2.log"
     2 1415399097382 1 "Listening on port 23000"
     3 1415399418377 2 "New log rotation settings received, Metric: 0, Interval: 720"
     4 1416178611851 2 "Opened database ./logs/Syren2.log"
     5 1416178611852 2 "Listening on port 23000"
     6 1416178612776 2 "New log rotation settings received, Metric: 0, Interval: 720"


"SELECT rowid, timestamp, debugLevel, message FROM Sy_logger WHERE rowid >= ? AND debugLevel IN ( 0, 1, 2 ) ORDER BY ? ASC;" 0 1
     1 1415399097350 0 "Opened database ./logs/Syren2.log"
     2 1415399097382 1 "Listening on port 23000"
     3 1415399418377 2 "New log rotation settings received, Metric: 0, Interval: 720"
     4 1416178611851 2 "Opened database ./logs/Syren2.log"
     5 1416178611852 2 "Listening on port 23000"
     6 1416178612776 2 "New log rotation settings received, Metric: 0, Interval: 720"

从命令行使用时,SQL 语句返回预期的结果集。有什么建议么?我正在使用 Qt v5.3.2。

【问题讨论】:

看起来您正在使用准备好的查询,但您的示例代码不包含构建查询的部分。 @MrEricSir 你说得对,我觉得没有必要显示代码,因为我给出了QSqlQuery::lastQuery() 返回的输出 - 这是重要的一点。 【参考方案1】:

documentation 说:

如果 ORDER BY 表达式是一个常量整数 K,则该表达式被视为结果集第 K 列的别名。

但是,参数不被视为常量,因此您用于此参数的值被用作恰好对所有行都相同的表达式。

如果要按不同的列排序,则必须动态构造SQL语句。

【讨论】:

就是这样!谢谢。

以上是关于QSqlQuery 忽略 SQLite DB 的排序顺序的主要内容,如果未能解决你的问题,请参考以下文章

QSqlQuery最后无法正常工作

qt操作sqlite 如何使用vacuum命令?

不要通过 QSqlQuery 获得所有 sqlite pragma 的结果

QSqlQuery 与列名 Sqlite 的 prepare 和 bindValue

使用 next() 进行前向迭代的 SQLite 的 QSqlQuery 只会找到一行

不忽略 db.sqlite3 文件,即使我在 django 项目的 .gitignore 中指定