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 函数可以修改文件权限。

posted @   卑以自牧lq  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示