python保存在内存sqlite中

时间:2011-04-29 11:43:52

标签: python sqlite

是否可以将内存中的sqlite数据库保存到硬盘? 如果可能的话,一些python代码会很棒。

提前致谢。

修改

我使用apsw完成了这项任务。它就像一个魅力。谢谢你的贡献。

7 个答案:

答案 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()