跳转到主要内容

相对于基础存储存储变更的ZODB存储

项目描述

zc.demostorage2模块提供了一个存储实现,它包装了两个存储,一个基础存储和一个用于存储变更的存储。基础存储永远不会被写入。所有新记录都写入变更存储。这两个存储都应使用

  • 打包的64位无符号整数作为对象ID,

  • 按顺序分配对象ID,从0开始,

  • 在变更存储的情况下,接受外部分配的对象ID。

此外,假设第一个存储中分配的对象ID少于2**63。

注意,DemoStorage还假设其基础存储使用按顺序分配的64位无符号整数对象ID。

变更历史

0.1.1 (2008-02-07)

修复了一个包装错误,导致某些文件被省略。

0.1 (2008-02-04)

初始版本。

配置

以下部分显示了如何从Python创建zc.demostorage2存储。如果您使用ZConfig,您需要

  • import zc.demostroage2

  • 包含一个demostroage2部分

以下是一个演示如何配置演示存储以及如何从Python使用配置的示例

>>> import ZODB.config
>>> storage = ZODB.config.storageFromString("""
...
... %import zc.demostorage2
...
... <demostorage2>
...    <filestorage base>
...       path base.fs
...    </filestorage>
...    <filestorage changes>
...       path changes.fs
...    </filestorage>
... </demostorage2>
... """)

这创建了一个从名为base.fs的文件存储获取基础数据并存储更改到名为changes.fs的文件存储的演示存储。

>>> storage
<DemoStorage2: DemoStorage2(base.fs, changes.fs)>
>>> storage.close()

演示(doctest)

请注意,大多数人将通过ZConfig来配置存储。如果你是这些人之一,你可能想在这里停止。 :) 下面的示例展示了如何从Python使用存储,但它们也涉及了许多你可能不感兴趣的具体细节。

为了了解这是如何工作的,我们首先创建一个基本存储,并在其中放置一个对象(除了根对象)

>>> from ZODB.FileStorage import FileStorage
>>> base = FileStorage('base.fs')
>>> from ZODB.DB import DB
>>> db = DB(base)
>>> from persistent.mapping import PersistentMapping
>>> conn = db.open()
>>> conn.root()['1'] = PersistentMapping({'a': 1, 'b':2})
>>> import transaction
>>> transaction.commit()
>>> db.close()
>>> import os
>>> original_size = os.path.getsize('base.fs')

现在,以只读模式重新打开基本存储

>>> base = FileStorage('base.fs', read_only=True)

并打开一个新的存储来存储更改

>>> changes = FileStorage('changes.fs')

然后在demofilestorage中将这两个存储合并

>>> from zc.demostorage2 import DemoStorage2
>>> storage = DemoStorage2(base, changes)

如果没有事务,存储会报告基本数据库的最后事务

>>> storage.lastTransaction() == base.lastTransaction()
True

让我们添加一些数据

>>> db = DB(storage)
>>> conn = db.open()
>>> items = conn.root()['1'].items()
>>> items.sort()
>>> items
[('a', 1), ('b', 2)]
>>> conn.root()['2'] = PersistentMapping({'a': 3, 'b':4})
>>> transaction.commit()
>>> conn.root()['2']['c'] = 5
>>> transaction.commit()

在这里,我们可以看到我们没有修改基本存储

>>> original_size == os.path.getsize('base.fs')
True

但我们已经修改了更改数据库

>>> len(changes)
2

我们的最后事务反映了更改的最后事务

>>> storage.lastTransaction() > base.lastTransaction()
True
>>> storage.lastTransaction() == changes.lastTransaction()
True

让我们浏览一些方法,这样我们就可以看到我们是如何委派给新的底层存储的

>>> from ZODB.utils import p64, u64
>>> storage.load(p64(0), '') == changes.load(p64(0), '')
True
>>> storage.load(p64(0), '') == base.load(p64(0), '')
False
>>> storage.load(p64(1), '') == base.load(p64(1), '')
True
>>> serial = base.getTid(p64(0))
>>> storage.loadSerial(p64(0), serial) == base.loadSerial(p64(0), serial)
True
>>> serial = changes.getTid(p64(0))
>>> storage.loadSerial(p64(0), serial) == changes.loadSerial(p64(0),
...                                                          serial)
True

新对象的ID相当大

>>> u64(conn.root()['2']._p_oid)
4611686018427387905L

让我们看看其他一些方法

>>> storage.getName()
'DemoStorage2(base.fs, changes.fs)'
>>> storage.sortKey() == changes.sortKey()
True
>>> storage.getSize() == changes.getSize()
True
>>> len(storage) == len(changes)
True

撤销方法只是从更改存储中复制过来的

>>> [getattr(storage, name) == getattr(changes, name)
...  for name in ('supportsUndo', 'undo', 'undoLog', 'undoInfo')
...  ]
[True, True, True, True]

下载

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源分发

zc.demostorage2-0.1.3.tar.gz (7.0 kB 查看哈希值)

上传时间

支持