相对于基础存储存储变更的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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 536edbb810684d3fec69d4b97468dc04e90c3d4be2428f4862f5cacb2027d9da |
|
MD5 | 4066c73c6c335b8010c5807ce48d87e7 |
|
BLAKE2b-256 | f9d10fc856ac24721bfa0195134988274a1a0c63c5ab5ca1ab9ca385ec175e98 |