我的数据库格式不正确。当我尝试从两个表中的任何一个中获取记录时,它会引发异常:
DatabaseError:数据库磁盘映像格式错误
我知道通过命令行我可以这样做:
sqlite3 ".dump" base.db | sqlite3 new.db
我可以在Python中做这样的事情吗?
答案 0 :(得分:4)
据我所知你不能这样做(唉,我可能会弄错),因为python的sqlite3模块非常有限。
我能想到的唯一解决方法是通过pythons 调用 -command调用os命令shell(例如terminal,cmd,...)(more info):
将其与here中的信息结合起来,执行以下操作:
这是在Windows XP机器上完成的: 不幸的是我现在无法在unix机器上测试它 - 希望它能帮到你:
from subprocess import check_call
def sqliterepair():
check_call(["sqlite3", "C:/sqlite-tools/base.db", ".mode insert", ".output C:/sqlite-tools/dump_all.sql", ".dump", ".exit"])
check_call(["sqlite3", "C:/sqlite-tools/new.db", ".read C:/sqlite-tools/dump_all.sql", ".exit"])
return
第一个参数是调用sqlite3.exe。因为它在我的系统路径变量中,所以我不需要指定路径或后缀“.exe”。 其他参数链接到sqlite3-shell。
请注意,参数“.exit”是必需的,因此sqlite-shell将退出。否则check_call()将永远不会完成,因为外部cmd-shell或终端将被挂起。
当然应该删除转储文件......
编辑:更短的解决方案(功劳归OP(见评论))
os.system("sqlite3 C:/sqlite-tools/base.db .dump | sqlite3 C:/sqlite-tools/target.db")
刚试过这个:它有效。显然我在评论中错了。
答案 1 :(得分:1)
如果我理解正确,你想要的是在python中复制sqlite3数据库。我将如何做到这一点:
# oldDB = path to the corrupted db,
# newDB = path to the new db
def duplicateDB(oldDB, newDB):
con = sqlite3.connect(oldDB)
script = ''.join(con.iterdump())
con.close()
con = sqlite3.connect(newDB)
con.executescript(script)
con.close()
print "duplicated %s into %s" % (oldDB,newDB)
在您的示例中,请致电duplicateDB('base.db', 'new.db')
。 iterdump
函数等效于dump
。
请注意,如果您使用Python 3,则需要更改print
语句。