ZODB:同时使用常规 FileStorage 和 Zlib 压缩存储

ZODB: using both regular FileStorage as well as Zlib compressed storage

我目前正在编写一个 Python 桌面应用程序来执行一些基本的数据分析和数据显示。数据来自我们研究实验室的一些实验,我们使用 FileStorage 将数据存储在 ZODB 数据库中。

打开数据库的代码相当简单,看起来与您期望的一样:

self.storage = ZODB.FileStorage.FileStorage(filename)
self.db = ZODB.DB(self.storage)
self.db_connection = self.db.open()
self.db_root = self.db_connection.root

我想开始使用压缩存储来尝试将数据库文件保持在较小的大小 (https://pypi.org/project/zc.zlibstorage/),但我还想保持与以前没有的数据库文件的向后兼容性使用压缩存储。

如果我使用压缩存储的数据库,我可以简单地更改我的代码的第一行,所以现在我的代码应该是这样的:

self.storage = zc.zlibstorage.ZlibStorage(ZODB.FileStorage.FileStorage(filename))
self.db = ZODB.DB(self.storage)
self.db_connection = self.db.open()
self.db_root = self.db_connection.root

但如果我这样做,我的程序将如何处理只使用 FileStorage 而不是 ZLibStorage 的常规数据库?我想同时处理两者。

有没有办法确定 FileStorage 是否使用压缩,然后在需要时在 ZlibStorage 上分层?像这样:

self.storage = ZODB.FileStorage.FileStorage(filename)
if (self.storage is compressed):                                #pseudocode
    self.storage = zc.zlibstorage.ZlibStorage(self.storage)     #pseudocode
self.db = ZODB.DB(self.storage)
self.db_connection = self.db.open()
self.db_root = self.db_connection.root

还是我完全误解了事情的运作方式?任何帮助,将不胜感激!谢谢!

zstorage = ZODB.FileStorage.FileStorage('testz.fs') # testz.fs has been created with ZlibStorage
try:
 db = ZODB.DB(zstorage)
except:
 zstorage.close()
 zstorage = zc.zlibstorage.ZlibStorage(ZODB.FileStorage.FileStorage('testz.fs'))
 db = ZODB.DB(zstorage)

不如应有的健壮(使用正确的异常 _pickle.UnpicklingError 进行改进)