是否可以将内存中的sqlite数据库保存到硬盘? 如果可能的话,一些python代码会很棒。
提前致谢。
修改
我使用apsw完成了这项任务。它就像一个魅力。谢谢你的贡献。
答案 0 :(得分:9)
(披露:我是APSW作者)
制作数据库二进制副本的唯一安全方法是使用属于SQLite的备份API,并由APSW公开。这对订购,锁定和并发做了正确的事。
要制作数据库的SQL(文本)副本,请使用APSW shell,其中包含非常完整的.dump实现。您可以使用cursor.execute()将SQL转回数据库。
在最近的平台上,由于操作系统维护文件系统缓存,因此您不太可能在内存数据库和磁盘数据库之间看到太大差异(假设您已关闭磁盘的日记功能)。像Windows XP这样的老式操作系统确实有一个默认配置,无论你有多少RAM,都只使用10MB内存用于文件缓存。
答案 1 :(得分:6)
是。创建与数据库的连接时,将:memory:
替换为要保存数据库的路径。
sqlite使用基于文件的DB的缓存,所以这不应该(太慢)。
答案 2 :(得分:3)
根据sqlite3 python documentation,您可以使用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)
答案 3 :(得分:2)
打开基于磁盘的数据库,只需将所有内容从一个复制到另一个。
答案 4 :(得分:2)
我的 2021 游戏笔记本可以执行 SQL 操作,主要是 INSERT,在内存中比磁盘快 100 倍。我正在使用 sqlalchemy 的原始连接进行备份(将内存数据库复制到磁盘)。
# create in-memory database. get raw_connection.
engine_memory = sqlalchemy.create_engine('sqlite://')
raw_connection_memory = engine_memory.raw_connection()
# do something to in-memory db
raw_cursor_memory.executescript(my_sql_script)
# save memory db to disk file.
engine_file = sqlalchemy.create_engine('sqlite:///myfile.sqlite')
raw_connection_file = engine_file.raw_connection()
raw_connection_memory.backup(raw_connection_file.connection)
raw_connection_file.close()
engine_file.dispose()
答案 5 :(得分:1)
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
答案 6 :(得分:0)
有一种无需使用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 bck:
conn.backup(bckup)
bckup.close()
conn.close()