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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:57:03