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

Python+SQLite3用Fernet解密后数据库只读无法插入问题求助

解决sqlite3解密后只读问题的方案

1. 修复数据库连接关闭逻辑

你的DataBaseManager类__del__方法中,self.con.close未实际调用关闭函数(缺少括号),导致数据库连接无法正常释放,文件可能被持续占用引发权限异常。

修改代码:

def __del__(self):
    self.con.close()  # 添加上括号,执行关闭操作

2. 修正实例方法调用方式

初始化数据库时,错误地用类直接调用实例方法DataBaseManager.inicializar(),这会因缺少self参数报错,正确做法是用创建的实例调用:

dbm = DataBaseManager(dbfile)
dbm.inicializar()  # 用实例调用,而非类直接调用

3. 解密后显式设置文件权限

即使手动用chmod修改权限,解密后写入的文件可能继承了异常权限。在decryptdb函数末尾添加权限设置代码:

import os

def decryptdb(keyfile, dbfile, dbencrypt):
    # 原有解密代码...
    
    with open (dbfile, "wb") as decrypteddb:
        decrypteddb.write(decrypted)
    
    # 显式设置文件可读写权限
    os.chmod(dbfile, 0o664)

同时检查文件所有者:运行ls -l pstore.db,确保当前用户是文件所有者,否则用sudo chown 你的用户名:pstore.db修改。

4. 清理SQLite临时文件

SQLite会生成pstore.db-journal或pstore.db-wal等临时文件,若这些文件权限异常,也会导致数据库只读。解密前删除相关临时文件,或在连接时禁用WAL模式:

class DataBaseManager(object):
    def __init__(self,db):
        self.con = sqlite3.connect(db)
        # 禁用WAL模式,避免生成额外临时文件
        self.con.execute("PRAGMA journal_mode=DELETE;")
        self.cur = self.con.cursor()

5. 解密前先删除原数据库文件

若原数据库文件未被完全覆盖,可能导致文件损坏表现为只读。解密前先删除原文件:

import os

def decryptdb(keyfile, dbfile, dbencrypt):
    # 先删除原数据库文件(如果存在)
    if os.path.exists(dbfile):
        os.remove(dbfile)
    
    # 原有解密代码...

测试流程

  1. 关闭所有可能连接数据库的程序,确保文件未被占用
  2. 删除现有pstore.db、pstore.db-journal、pstore.db-wal文件
  3. 重新执行解密操作,再尝试INSERT写入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:21:01