是否可以将我的内存中的sqlite数据库保存到硬盘?如果可能的话,一些python代码会很棒.
提前致谢.
编辑:
我使用apsw完成了这项任务.它就像一个魅力.谢谢你的贡献.
Rog*_*nns 10
(披露:我是APSW的作者)
制作数据库二进制副本的唯一安全方法是使用属于SQLite的备份API,并由APSW公开.这对订购,锁定和并发做了正确的事情.
要创建数据库的SQL(文本)副本,请使用APSW shell,其中包含非常完整的.dump实现.您可以使用cursor.execute()将SQL转回数据库.
在最近的平台上,由于操作系统维护文件系统缓存,因此您不太可能看到内存数据库和磁盘数据库之间存在很大差异(假设您关闭了磁盘的日志记录).像Windows XP这样的老式操作系统确实有一个默认配置,只要使用10MB内存用于文件缓存,无论你有多少内存.
有一种方法可以不使用 apsw 来备份内存数据库。backup() 是一种在磁盘上保存内存数据库副本的非阻塞方式。使用 conn.backup(dest) 如下所示:
import sqlite3
conn = sqlite3.connect('file:existing_db.db?mode=memory',detect_types=sqlite3.PARSE_DECLTYPES,uri=True)
bckup = sqlite3.connect('file:backup.db',detect_types=sqlite3.PARSE_DECLTYPES,uri=True)
with bckup:
conn.backup(bckup)
bckup.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
根据sqlite3 python 文档,您可以使用该iterdump()方法对内存数据库进行 .sql 文件转储,然后将该 .sql 文件应用于新的 sqlite 文件数据库就很简单了。
# Convert file existing_db.db to SQL dump file dump.sql
import sqlite3, os
con = sqlite3.connect('existing_db.db')
with open('dump.sql', 'w') as f:
for line in con.iterdump():
f.write('%s\n' % line)
Run Code Online (Sandbox Code Playgroud)
import apsw
memconn = apsw.Connection(":memory:")
memcursor = memconn.cursor()
memcursor.execute("create table foo(x,y,z)")
memcursor.execute("insert into foo values(?,?,?)", (1, 1.1, None))
thediskconn = apsw.Connection("adisk.db")
with thediskconn.backup("main", memconn, "main") as backup:
backup.step() # copy whole database in one go
memcursor.close()
memconn.close()
#continue with thediskconn
Run Code Online (Sandbox Code Playgroud)