如何在Python SQLite 3中将现有数据库文件加载到内存中?

79 投票
10 回答
55579 浏览
提问于 2025-04-16 04:55

我有一个现成的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

撰写回答