首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是ZODB数据模型?

什么是ZODB数据模型?
EN

Stack Overflow用户
提问于 2014-07-19 22:40:48
回答 1查看 478关注 0票数 0

假设我定义了一个新的持久类帐户,如ZODB教程中所描述的那样。

代码语言:javascript
复制
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()

在运行这个脚本之后,我编写了另一个脚本来访问我创建的对象。

代码语言:javascript
复制
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)

第二个脚本的输出是:

代码语言:javascript
复制
<__main__.Account object at 0x95fbaac>
0.0

但是,如果我注释定义了类帐户的行,则输出是:

代码语言:javascript
复制
<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中,我没有找到可以在没有类定义的情况下使用的数据层的文档。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-20 01:02:53

ZODB构建在模块之上;持久性只用于检测更改并在记录之间创建边界(因此,对一个持久对象的更改不需要写入整个对象树)。

然后,数据模型就是您的Python代码;pickle只是将重构存储到类位置,比如您的Account,以便从这些位置恢复实例。

删除Account类定义时,所有persistent都可以为数据提供占位符对象。它告诉您,pickle在模块__main__中寻找一个名为Account的类,ZODB对象id为2。

如果您想对数据进行内省,仍然可以检查Account实例在“损坏”对象的__Broken_state__属性中具有的属性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24845658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档