에 설명 된대로 새 영구 클래스 계정을 정의한다고 가정하면 the ZODB tutorial입니다.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()
이 스크립트를 실행 한 후 내가 만든 객체 에 액세스하는 다른 스크립트를 썼다.
<__main__.Account object at 0x95fbaac>
0.0
하지만 클래스 계정 정의 라인을 코멘트 경우 출력은 다음과 같습니다 :
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)
이 두 번째 스크립트의 출력은 선언을 반대
<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'
I 게스트는 아니다 데이터베이스에 첨부되어 있으므로 이전에 Account에서 정의한 메소드 나 메소드를 실행할 수 없습니다. 그러나 객체에있는 속성에 대한 액세스 권한이 있다면 명확하지 않습니다. 클래스 정의가없는 곳입니다. 그래서 내 질문은 : ZODB에 클래스 정의없이 개체에 액세스하는 데 사용할 수있는 기본 데이터베이스가 있습니까?
내 질문은 또한 다음과 같은 문제에 의해 좌우된다
나는 데이터베이스 는 애플리케이션 로직에서 분리 된 데이터 모델을 응용 프로그램에 길들여입니다. 새 모듈 X (클래스 정의)를 응용 프로그램에 통합 한 다음 X가 내 응용 프로그램에 문제가 있음을 발견했습니다. 기존의 접근법에서 I 은 로직 계층 없이 응용 프로그램을 중지하고 데이터베이스를 검사하여 데이터를 분석하고 수정하려고 할 수 있습니다. 그런 다음 모듈 X가 없으면 응용 프로그램을 다시 시작하십시오. 그러나 ZODB에서 클래스없이 사용할 수있는 데이터 계층에 대한 설명서는 찾을 수 없습니다.
'__Broken_state__' 모델은 OEM 데이터 모델과 비슷합니다. 따라서 클래스 참조가 깨지면 ZODB는 JSON 및 OEM과 호환되는 다른 데이터 모델과 유사한 기능을 제공합니다. –