You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04下QSqlDatabase连接SQLite写入无效问题求助

问题:Qt连接SQLite数据库成功但未创建表到指定文件

我正在使用Ubuntu 20.04系统,尝试写入本地的database.db文件但未成功。相关代码如下:

QString dbName = "/home/mustafa/Desktop/Programlama/QC/Flash_Cards/database.db";
QSqlDatabase con = QSqlDatabase::addDatabase("QSQLITE", dbName);
con.setUserName(dbName);
if(!con.open()){
    qDebug() << "failed";
}else{
    qDebug() << "ok";
}
QSqlQuery query(con);
con.commit();
bool ok = query.exec("CREATE TABLE ltable (name TEXT, num INT)");
qDebug() << ok;
con.commit();
con.close();

程序显示连接已打开且查询执行成功,但查看database.db文件发现为空,仿佛创建的是临时数据库,尽管已指定有效路径。我完全按照YouTube教程操作,但教程中的方法可行,我的却不行,恳请帮助。


解决方案

你的问题核心是未指定SQLite数据库的文件路径,导致Qt默认创建了内存临时数据库,程序关闭后数据直接丢失。

错误点拆解

  1. QSqlDatabase::addDatabase("QSQLITE", dbName)的第二个参数是连接名称,不是数据库文件路径,你混淆了这两个概念
  2. con.setUserName(dbName)完全多余,SQLite不需要用户名验证
  3. 缺少关键的setDatabaseName()调用,没有告诉Qt要操作的本地.db文件位置

修改后的可运行代码

QString dbPath = "/home/mustafa/Desktop/Programlama/QC/Flash_Cards/database.db";
QSqlDatabase con = QSqlDatabase::addDatabase("QSQLITE");
con.setDatabaseName(dbPath); // 核心:指定数据库文件路径
if(!con.open()){
    qDebug() << "连接失败:" << con.lastError().text(); // 打印具体错误信息,便于排查
}else{
    qDebug() << "连接成功";
}
QSqlQuery query(con);
bool ok = query.exec("CREATE TABLE ltable (name TEXT, num INT)");
if(ok){
    qDebug() << "表创建成功";
}else{
    qDebug() << "表创建失败:" << query.lastError().text(); // 打印查询错误
}
// SQLite默认自动提交,无需手动调用commit,除非你主动开启了事务
con.close();

额外提示

  • 数据库操作时务必打印错误信息,不管连接还是查询失败,都能快速定位问题
  • 若要使用事务,需先调用con.transaction(),执行完操作后再con.commit(),否则手动commit无效
  • 确认目标路径有读写权限,Ubuntu下可以用chmod命令调整权限(比如chmod 644 /home/mustafa/Desktop/Programlama/QC/Flash_Cards/database.db)

内容的提问来源于stack exchange,提问作者Mustafa Aslan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:15:15