You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过HTTP下载SQLite数据库并加载到内存中正常使用?

错误原因
  • 下载内容写入BytesIO后,文件指针停在内容末尾,直接调用read()读取到的是空内容。
  • sqlite3.connect的database参数仅接收数据库路径字符串,直接传入数据库字节会被识别为新建数据库的名称,最终打开空库,自然找不到表。
  • 原代码还缺少sqlite3库的导入,运行会先触发NameError。
正确实现方案

以下实现基于Python标准库,无需额外依赖,下载完成后所有操作都在内存中执行,临时文件下载后会立即删除:

import sqlite3
import requests
import os
from tempfile import NamedTemporaryFile

def download_file_to_obj(url, file_obj):
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        for chunk in r.iter_content(chunk_size=8192):
            if chunk:
                file_obj.write(chunk)

def main(source_url):
    print('Downloading..')
    # 创建临时磁盘文件存储下载的数据库,关闭后自动删除
    with NamedTemporaryFile(delete=False, suffix='.db') as tmp_db:
        download_file_to_obj(source_url, tmp_db)
        tmp_db_path = tmp_db.name
    print('Download complete!')
    
    try:
        # 初始化纯内存数据库连接
        mem_conn = sqlite3.connect(':memory:')
        # 将下载的数据库内容完整备份到内存连接
        with sqlite3.connect(tmp_db_path) as tmp_conn:
            tmp_conn.backup(mem_conn)
    finally:
        # 立即删除临时磁盘文件,后续所有操作都在内存中执行
        os.unlink(tmp_db_path)
    
    # 正常操作内存中的数据库
    cursor = mem_conn.cursor()
    cursor.execute('SELECT * FROM my_table limit 10;')
    data = cursor.fetchall()
    print(data)
    # 操作完成后关闭内存连接
    mem_conn.close()

如果你的SQLite数据库体积很小,也可以使用内存临时文件的方式避免磁盘写入,Linux/macOS下可以指定临时文件生成在/dev/shm内存文件系统中,Windows下可以通过tempfile的dir参数指定到内存盘路径。

内容的提问来源于stack exchange,提问作者Protect children of Donbas2014

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:24:03