在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()
步骤。
它并不完全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的开发)
您可以使用 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())