QSqlite 使用记录
QSqlite 使用记录
一个QSqlDatabase的实例表示着一个对数据库的连接
setDatabaseName(""); 指定文件路径,就可以操作指定的文件
SQLite 文档还贴心地指出了什么时候用 client/server SQL 数据库(如MySQL)
Is the data separated from the application by a network? → choose client/server
Many concurrent writers? → choose client/server
Big data? → choose client/server
Otherwise → choose SQLite!
插入
sqlite在没有显式使用事务的时候会为每条insert都使用事务操作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的操作,时间都耗费在I/O操作上,所以很慢。
Sqlite 插入多条数据一定要显示用事务,用了事务之后所有的操作都是一个事务,只需要打开一次文件。
database.transaction(); // 显示用事务
//do something
database.commit();
}
批量插入用list更有效
QSqlQuery sqlQuery(_database);
sqlQuery.prepare("INSERT INTO mark VALUES(?,?,?,?)");
QVariantList cellList, nameList, ageList, idList;
for (int i = 0; i < moredb.size(); i++) {
cellList << moredb.at(i).cell;
nameList << moredb.at(i).layer;
ageList << moredb.at(i).points;
idList << moredb.at(i).id;
}
sqlQuery.addBindValue(cellList);
sqlQuery.addBindValue(nameList);
sqlQuery.addBindValue(ageList);
sqlQuery.addBindValue(idList);
_database.transaction(); // Begins transaction
if (!sqlQuery.execBatch()) { // 进行批处理,如果出错就输出错误
qDebug() << sqlQuery.lastError();
}
_database.commit();
设置等待时间
_database.close(); // 要先关掉数据库设置才会生效
setConnectOptions("QSQLITE_BUSY_TIMEOUT=10000"); // 单位是毫秒
删除
测试删除20万条数据, 删除加不加事务结果基本相同
修改
测试修改10万条数据,加不加事务结果基本相同
查找
测试查找40万条数据,加不加事务结果基本相同
表名不区分大小写,表中的字段区分大小写
多进程写时:
直接用 "BEGIN IMMEDIATE" 命令,用qt封装的transaction()函数会有锁的冲突。sqlite 有五种锁,严格程度不一样。
QSqlQuery sql(_database);
sql.exec("BEGIN IMMEDIATE"); // 替代 _database.transaction();
设置主键自增:
// 创建表
QString str = "CREATE TABLE cell (id INTEGER primary key AUTOINCREMENT, \
name TEXT NOT NULL)";
sql.exec(str);
// 插入名为cell1的数据,id自增
sql.exec("INSERT INTO cell VALUES(NULL, cell1)");
int id = sql.lastInsertId().toInt(); // 获取上一次自增的id
推荐用逻辑删除,不推荐物理删除
为什么不推荐使用物理删除,因为恢复数据很困难
物理删除会使自增主键不再连续
核心业务表 的数据不建议做物理删除,只适合做状态变更。
锁
sqlite 的锁很粗,是库级锁,写的时候直接锁住整个sqlite数据库文件。
mysql 有表级锁,最新的有行级锁,写的时候不影响其他未上锁对象的读写
文件权限
sqlite相当是用文件保存数据,当多人操作同一个数据库时,文件要放在大家都能访问的公共目录,且其他人要有文件的相关权限。
c语言 #include <sys/stat.h> 中的chmod 函数可以修改文件权限。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性