【问题标题】:Sqlite rename empty tableSqlite 重命名空表
【发布时间】:2026-01-09 19:50:02
【问题描述】:

我正在尝试运行以下行:

"ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old"

flocksStartWeight 是一个空的 sqlite(3.15.2) 表。 当我在 sqlite db 浏览器中运行它时,它可以重命名,但是当我尝试从我的 qt 应用程序运行它时,它会失败并显示警告。:

“警告:DatabaseConnectionImplementation::executeQuery: 失败 查询“更改表flocksStartWeight重命名为flocksStartWeight_old”, () WARNING: "No query Unable to fetch row"

相关代码:

执行查询调用

bool query2Successful = db->executeQuery("ALTER TABLE flocksStartWeight RENAME TO flocksStartWeight_old")->isValid();

方法

DatabaseResultUPtr DatabaseConnectionImplementation::executeQuery(const QString& query, const QVariantList& args)
{
    QMutexLocker tsLocker(&tsLock);

    if (!db.isOpen())
    {
        hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << "DatabaseConnectionImplementation::executeQuery: Failed, database " << dbName << " not open";
        return DatabaseResultUPtr(new DatabaseResult());
    }

    QSqlQuery q(db);
    q.prepare(query);
    for(int i = 0 ; i < args.size() ; i++)
        q.bindValue(i, args.value(i));
    if (!q.exec())
    {
        hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << "DatabaseConnectionImplementation::executeQuery: Failed for query " << q.executedQuery() << ", " << args;
        hDebug(TRACING_CONTEXT_RUNTIME_WARNING) << q.lastError().text();
        return DatabaseResultUPtr(new DatabaseResult());
    }

    QMutexLocker scoped_lock(&queryMutex);
    ++queryCount;

    return DatabaseResultUPtr(new DatabaseResult(q, this));
}

我做了很多类似的重命名,它们都运行良好。 唯一的区别是flocksStartWeight 不包含任何数据。所以我手动在表格中添加了一行并再次尝试。这次它工作得很好。 我应该如何重命名一个空表? 编辑:

我补充说:

if(!q.prepare(query))
{
    qDebug() << "Preparing query failed for " << query;
}

它到达查询的 qDebug 行,所以它在 prepare 方法上已经失败了。

编辑: 当我问这个问题时,我假设数据库状态是错误的。问题无法重现,问题可以删除。

【问题讨论】:

  • 也许您的 SQLite 浏览器的 SQLite 版本与您的 Qt 插件使用的不同?
  • 你的 Qt 版本是多少?
  • QSqlQuery::exec()被调用时,查询的最后一个错误被重置..现在你添加了prepare()的检查..它在这里你应该显示最后一个错误..(即在 exec()) 之前。您现在看到的错误可能并没有传达出太多关于问题的信息。
  • "question can be removed" 为什么不自己删除(当然如果确实需要删除的话)?这比等待版主看到您的编辑更简单、更快捷:)
  • @Fareanor 你不能自己删除一个有赏金的问题。

标签: c++ sqlite qt


【解决方案1】:

当调用 q.exec() 时,查询的最后一个错误被重置。您应该在 exec() 之前显示最后一个错误。由于您添加了对 prepare() 的检查,因此您应该在其中显示它。

【讨论】: