QSqlTableModel使用时出现SQLite数据库锁定问题,求更简易解决方案
解决方案
以下均为无需自定义Model的低改造成本方案:
方案1:开启SQLite WAL读写并发模式
初始化Qt数据库连接后,立刻执行两条PRAGMA指令配置存储模式:from PyQt5.QtSql import QSqlDatabase, QSqlQuery db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName("你的数据库文件路径.sqlite") if db.open(): query = QSqlQuery(db) query.exec("PRAGMA journal_mode = WAL;") query.exec("PRAGMA synchronous = NORMAL;")WAL是SQLite原生支持的读写并发模式,开启后Qt的读连接不会占用独占锁,你用sqlite3执行写操作时不会触发锁冲突,不需要修改现有业务逻辑,是成本最低的方案。
补充操作:sqlite3写操作完成后,调用QSqlTableModel.select()即可刷新主视图数据,保证界面显示最新内容。方案2:显式配置Qt数据库连接为只读模式
你的主视图本身是只读设计,打开Qt连接时指定只读参数,避免Qt持有写锁权限:from PyQt5.QtCore import QIODevice from PyQt5.QtSql import QSqlDatabase db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName("你的数据库文件路径.sqlite") # 打开时指定只读模式 db.open(QIODevice.ReadOnly)只读模式下Qt的数据库连接只会申请共享读锁,不会触发SQLite的独占写锁限制,和你的sqlite3写操作天然兼容。
方案3:缩短sqlite3写连接的持有时间
执行写操作的sqlite3连接不要长期持有,做到用完即关:每次需要写入时才打开连接,执行完SQL、commit事务后立刻关闭连接,最大程度降低锁冲突概率。
内容的提问来源于stack exchange,提问作者Jussi Nurminen
相关产品推荐
相关产品推荐

