在Python中转储来自格式错误的SQLite的数据

时间:2016-01-19 16:38:03

标签: python sqlite

我的数据库格式不正确。当我尝试从两个表中的任何一个中获取记录时,它会引发异常:

  

DatabaseError:数据库磁盘映像格式错误

我知道通过命令行我可以这样做:

sqlite3 ".dump" base.db | sqlite3 new.db

我可以在Python中做这样的事情吗?

2 个答案:

答案 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语句。