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) # 原有解密代码...
测试流程
- 关闭所有可能连接数据库的程序,确保文件未被占用
- 删除现有
pstore.db、pstore.db-journal、pstore.db-wal文件 - 重新执行解密操作,再尝试INSERT写入
内容的提问来源于stack exchange,提问作者Inoku
相关产品推荐
相关产品推荐

