从 io.BytesIO 流打开 sqlite3 数据库?

问题描述 投票:0回答:3

在Python3.4中,是否可以从io.BytesIO流打开SQLite3数据库?

类似于:

with open("temp.db", "rb") as openf:
    byte_stream = io.BytesIO(openf.read())
sqlite3.connect(byte_stream)

短篇故事是:我有一个流(

byte_stream
),它sqlite数据库文件。出于安全原因,我无法执行以下操作(无法创建未加密的文件):

with open("temp.db", "wb") as openf:
    openf.write(byte_stream)
sqlite3.connect("temp.db")

是否有一些我无法找到的 sqlite3 的较低级别 API?我假设

sqlite3.connect
只是在某个时刻调用
open()
并将文件作为字节流打开。我只是想跳过那个
open()
步骤。

python python-3.x sqlite
3个回答
3
投票

这是 Python 的

sqlite3
模块不可能实现的。

如果您使用 APSW,您可以尝试编写自己的虚拟文件系统


3
投票

它并不完全open-ing,因此您可以运行 SQL 查询,但您可以使用 https://github.com/uktrade/stream-sqlite 来获取文件中的所有行。

import io
from stream_sqlite import stream_sqlite
import httpx

byte_stream = io.BytesIO(httpx.get('http://www.parlgov.org/static/stable/2020/parlgov-stable.db').content)

for table_name, pragma_table_info, rows in stream_sqlite(byte_stream, max_buffer_size=1_048_576):
    for row in rows:
        print(row)

(免责声明:我大量参与了stream-sqlite的开发)


0
投票

您可以使用 https://github.com/michalc/sqlite-memory-vfs 与 APSW 一起查询内存中的 SQLite 文件,而无需访问磁盘。它与 io.BytesIO 本身无关,而是字节实例的可迭代。

按原样从自述文件中获取示例:

import apsw
import httpx
import sqlite_memory_vfs

memory_vfs = sqlite_memory_vfs.MemoryVFS()

# Any iterable of bytes can be used. In this example, they come via HTTP
with httpx.stream("GET", "https://www.example.com/my_dq.sqlite") as r:
    memory_vfs.deserialize_iter('my_db.sqlite', r.iter_bytes())

with apsw.Connection('my_db.sqlite', vfs=memory_vfs.name) as db:
    cursor.execute('SELECT * FROM foo;')
    print(cursor.fetchall())
© www.soinside.com 2019 - 2024. All rights reserved.