假设我定义了一个新的持久类帐户,如ZODB教程中所描述的那样。
import persistent, ZODB, ZODB.FileStorage, import transaction
class Account(persistent.Persistent):
def __init__(self):
self.balance = 0.0
def deposit(self, amount):
self.balance += amount
def cash(self, amount):
assert amount < self.balance
self.balance -= amount
storage = ZODB.FileStorage.FileStorage('mydata.fs')
db = ZODB.DB(storage)
connection = db.open()
root = connection.root
root.accounts = BTrees.OOBTree.BTree()
root.accounts['account-1'] = Account()
transaction.commit()在运行这个脚本之后,我编写了另一个脚本来访问我创建的对象。
import persistent, ZODB, ZODB.FileStorage
class Account(persistent.Persistent):
...
storage = ZODB.FileStorage.FileStorage('mydata.fs')
db = ZODB.DB(storage)
connection = db.open()
root = connection.root
print(root.accounts['account-1'])
print(root.accounts['account-1'].balance)第二个脚本的输出是:
<__main__.Account object at 0x95fbaac>
0.0但是,如果我注释定义了类帐户的行,则输出是:
<persistent broken __main__.Account instance '\x00\x00\x00\x00\x00\x00\x00\x02'>
Traceback (most recent call last):
File "test.py", line 24, in <module>
print(root.accounts['account-1'].balance)
AttributeError: 'Account' object has no attribute 'balance'我认为对象声明没有附加到数据库中,所以我们不能执行以前在帐户中定义的方法。但我还不清楚,在没有找到类定义的对象中,我是否可以访问属性。因此,我的问题是:是否有一个基本数据模型可以用于访问ZODB中没有类定义的对象?
我的问题也是出于以下关切:
我习惯于将数据库的数据模型与应用程序逻辑分离的应用程序。假设我在应用程序中合并了一个新的模块X(定义类),然后我发现X在我的应用程序中产生了问题。在经典的方法中,我总是可以停止应用程序并检查数据库,而不需要逻辑层来分析和尝试修复数据。然后,在没有模块X的情况下再次启动应用程序。但是在ZODB中,我没有找到可以在没有类定义的情况下使用的数据层的文档。
发布于 2014-07-20 01:02:53
ZODB构建在模块之上;持久性只用于检测更改并在记录之间创建边界(因此,对一个持久对象的更改不需要写入整个对象树)。
然后,数据模型就是您的Python代码;pickle只是将重构存储到类位置,比如您的Account,以便从这些位置恢复实例。
删除Account类定义时,所有persistent都可以为数据提供占位符对象。它告诉您,pickle在模块__main__中寻找一个名为Account的类,ZODB对象id为2。
如果您想对数据进行内省,仍然可以检查Account实例在“损坏”对象的__Broken_state__属性中具有的属性。
https://stackoverflow.com/questions/24845658
复制相似问题