如何通过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
相关产品推荐
相关产品推荐

