如何在Python SQLite 3中将现有数据库文件加载到内存中?
我有一个现成的SQLite 3数据库文件,我需要在这个文件上进行一些复杂的计算。直接从文件里计算非常慢,而且这个文件不大(大约10MB),所以把它加载到内存里应该没问题。
有没有一种Python的方式可以把这个现有的文件加载到内存中,以加快计算速度呢?
10 个回答
16
sqlite3.Connection.iterdump
是一个功能,可以把数据库以SQL文本格式导出。这个功能特别适合把内存中的数据库保存起来,以便以后再恢复。它的作用和在sqlite3命令行中使用的 .dump
命令是一样的。
你可以使用这个功能,把存储在硬盘上的数据库导出到内存中,这样就可以进行计算了。当计算完成后,再把结果导出回硬盘上。
65
那sqlite3.Connection.backup(...)
这个方法呢?这个方法可以在SQLite数据库被其他用户访问,或者同一个连接同时被使用的情况下,仍然进行备份。也就是说,即使数据库正在被使用,你也可以安全地备份它。这个功能在SQLite 3.6.11版本或更高版本中可用,3.7版本中首次引入。
import sqlite3
source = sqlite3.connect('existing_db.db')
dest = sqlite3.connect(':memory:')
source.backup(dest)
129
这是我为我的Flask应用写的代码片段:
import sqlite3
from io import StringIO
def init_sqlite_db(app):
# Read database to tempfile
con = sqlite3.connect(app.config['SQLITE_DATABASE'])
tempfile = StringIO()
for line in con.iterdump():
tempfile.write('%s\n' % line)
con.close()
tempfile.seek(0)
# Create a database in memory and import from tempfile
app.sqlite = sqlite3.connect(":memory:")
app.sqlite.cursor().executescript(tempfile.read())
app.sqlite.commit()
app.sqlite.row_factory = sqlite3.Row