【发布时间】:2021-01-22 08:36:30
【问题描述】:
我正在尝试通过relstorage 在 sqlite 后端保存一个 > 1GB 的 blob。以下最小工作示例
- 删除之前创建的所有数据库以及 blob 目录,
- 创建一个新数据库并
- 将 1GB 的 blob 保存到数据库中。
最小工作示例:
import os
import shutil
from ZODB import blob, config
connectionString = """
%import relstorage
<zodb main>
<relstorage>
blob-dir blob
keep-history false
cache-local-mb 0
<sqlite3>
data-dir .
</sqlite3>
</relstorage>
</zodb>
"""
# cleaning up
for x in os.listdir():
if "sqlite" in x:
os.remove(x)
shutil.rmtree("blob", True)
# creating database
db = config.databaseFromString(connectionString)
with db.transaction() as conn:
conn.root.blob = blob.Blob()
with conn.root.blob.open("w") as f:
f.write(b"\0" * 1024 ** 3)
在新创建的对象的提交期间(在 db.transaction with-block 的 __exit__ 方法中)发生错误并出现以下最终异常:
sqlite3.InterfaceError:错误绑定参数 2 - 可能是不受支持的类型。
保存大小为 1024 ** 2 的 blob 不会引发异常。
如何在不使用共享 blob 目录的情况下使用 relstorage 在 sqlite 后端保存 blob?
【问题讨论】:
-
错误是重新分级数据类型而不是对象的大小。你会评论导致代码错误的行吗?
-
@Harkal 我澄清了问题中出现异常的确切点。如果使用了错误的类型,为什么它适用于较小的 blob(如
1024 ** 2)? -
我怀疑你达到了 sqlite 的存储限制。见sqlite.org/limits.html。如果它最多可以工作 10e9 个字节,那就是你的问题。如果是这样,您可以尝试使用更大限制的自定义构建。
标签: python sqlite blob zodb relstorage