2014-07-19 2 views
0

에 설명 된대로 새 영구 클래스 계정을 정의한다고 가정하면 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에서 클래스없이 사용할 수있는 데이터 계층에 대한 설명서는 찾을 수 없습니다.

답변

3

ZODB는 pickle module 위에 구축됩니다. 지속성은 변경 사항을 감지하고 레코드 사이의 경계를 만드는 역할을합니다 (따라서 하나의 영구 객체를 변경하면 전체 객체 트리를 작성하지 않아도됩니다).

데이터 모델 은 파이썬 코드입니다. pickle은 인스턴스를 복원하기 위해 Account과 같은 클래스 위치에 리엑스를 저장하기 만합니다.

Account 클래스 정의를 제거하면 모두 persistent은 데이터에 대한 개체 틀 개체를 제공 할 수 있습니다. 그것은 pickle 모듈 __main__Account라는 이름의 클래스를 찾는 것을하고 ZODB 개체 ID가 여전히 Account 인스턴스가 '깨진'개체의 __Broken_state__ 속성에 있던 속성을 검사 할 수 있습니다 2.

있음을 알려줍니다 , 당신이 그 데이터를 introspect하고 싶다면.

+0

'__Broken_state__' 모델은 OEM 데이터 모델과 비슷합니다. 따라서 클래스 참조가 깨지면 ZODB는 JSON 및 OEM과 호환되는 다른 데이터 모델과 유사한 기능을 제공합니다. –