Python附加SQLite数据库遇“database disk image is malformed”错误,手动操作正常
问题描述
我要把多个数据库合并到output_db这个单数据库里,用Python逐个附加的时候,部分数据库会随机报错:
Database Error: database disk image is malformed
用到的代码是:
connection = sqlite3.connect(output_db) connection.execute("attach '" + dat_file_path + "' as input_db")
但用DB Browser for SQLite手动附加这些数据库完全没问题。我试过完整性检查、真空清理(VACUUM)、重新导入源数据,都没解决。现在只能用Python 3.6.8+SQLite 3.7.17,而且换SQLite 3.32.2环境也会出同样的错。
可行的解决办法
别直接拼路径,用参数化查询
直接把路径拼进SQL语句里,万一路径有空格、引号这类特殊字符,会导致SQL语法错误,反而触发“损坏”的误报。改成参数化传递路径:connection = sqlite3.connect(output_db) # 用?当占位符,让sqlite3自动处理路径转义 connection.execute("attach ? as input_db", (dat_file_path,))附加前单独校验源数据库
随机报错可能是源数据库被附加时刚好有IO问题,先单独打开做完整性检查,没问题再附加:import sqlite3 def check_db_ok(db_path): try: conn = sqlite3.connect(db_path) cursor = conn.cursor() cursor.execute("PRAGMA integrity_check;") if cursor.fetchone()[0] != "ok": return False conn.close() return True except Exception: return False # 合并前先校验 if check_db_ok(dat_file_path): connection = sqlite3.connect(output_db) connection.execute("attach ? as input_db", (dat_file_path,)) # 这里写合并数据的逻辑 connection.execute("detach input_db") connection.close() else: print(f"{dat_file_path} 校验不通过,跳过")把SQLite同步模式设为FULL
旧版本SQLite默认同步模式可能导致写入时文件损坏,强制开全同步:connection = sqlite3.connect(output_db) connection.execute("PRAGMA synchronous = FULL;") connection.execute("attach ? as input_db", (dat_file_path,))复制源库到临时文件再附加
要是源数据库存在的存储设备有IO延迟,复制到本地临时目录后再附加能避免随机错误:import shutil import tempfile import os # 创建临时数据库文件 tmp_path = tempfile.mktemp(suffix='.db') shutil.copy(dat_file_path, tmp_path) try: connection = sqlite3.connect(output_db) connection.execute("attach ? as input_db", (tmp_path,)) # 执行合并操作 finally: connection.close() os.unlink(tmp_path)
内容的提问来源于stack exchange,提问作者breversa
相关产品推荐
相关产品推荐

