【问题标题】:Open a sqlite3 database from an io.BytesIO stream?从 io.BytesIO 流中打开 sqlite3 数据库?
【发布时间】:2021-10-09 18:56:32
【问题描述】:

在 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() 步骤。

【问题讨论】:

  • 你是怎么得到字节流的?
  • SQLite3 python 绑定使用 SQLite3 C 库,可能还有 sqlite3_open_v2 函数,它接受文件名(或 VFS URL,但如果 Python 公开了该 API,那将是相当高级的和 IDK)。
  • @ColonelThirtyTwo 是正确的,如果没有检查实现,则实际上调用了 open() - 请参阅Modules/_sqlite/connection.c:102 了解实际实现(在 C 中)。
  • 是的,我正在查看 C 实现,试图看看是否有办法做到这一点。乍一看没有发现任何东西,但我希望其他人知道一些事情。至于 VFS URL,它是公开的,但没有真正记录在案。见docs.python.org/3.5/library/sqlite3.html#sqlite3.connect(我认为。)

标签: python python-3.x sqlite


【解决方案1】:

这对于 Python 的 sqlite3 模块是不可能的。

如果您使用的是 APSW,可以尝试编写自己的 virtual file system

【讨论】:

  • 我害怕那个。创建一个内存数据库sqlite3.connect(':memory:') 然后以某种方式用流中的数据替换它呢?还是从流中导入数据?有这样的可能吗?
  • 不,您无法获取内存数据库的底层字节。
  • 链接不真实。
【解决方案2】:

它还没有完全打开,因此您可以运行 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的开发)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多