sqlite バックエンドでrelstorageを介して 1GB を超えるブロブを保存しようとしています。次の最小限の作業例
- 以前に作成されたデータベースを 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 のバインド エラー - おそらくサポートされていない型です。
サイズを指定して BLOB を保存して1024 ** 2
も、例外は発生しません。
共有ブロブディレクトリを使用せずに、relstorage を使用して sqlite バックエンドにブロブを保存するにはどうすればよいですか?