zope.generations

소프트웨어 스크린 샷:
zope.generations
소프트웨어 정보:
버전: 4.0.0 Alpha 1
업로드 날짜: 15 Apr 15
라이센스: 무료
인기: 2

Rating: nan/5 (Total Votes: 0)

zope.generations 데이터베이스에서 객체를 갱신하는 방법을 제공 할 때 애플리케이션 스키마 변경 & NBSP;. 응용 스키마는 본질적으로 데이터 구조 ZODB의 경우 또는 사건에 나타난 설명에서 클래스 구조 관계형 데이터베이스.
자세한 설명서
세대는 데이터베이스 응용 프로그램 스키마 변경의 개체를 업데이트하는 방법입니다. 애플리케이션은 본질적으로 스키마 데이터 구조, 또는 ZODB 관계형 데이터베이스의 경우에서 나타난 설명의 경우 클래스 구조이다.
당신이 응용 프로그램의 데이터 구조를 변경하는 경우, 예를 들어, 클래스의 기존 필드의 의미 론적 의미를 변경, 당신은 당신의 변화 이전에 생성 된 데이터베이스에 문제가있는 것입니다. 보다 철저한 토론과 가능한 솔루션의 경우, http://wiki.zope.org/zope3/DatabaseGenerations 참조
우리는 구성 요소 아키텍처를 사용하는 것, 그리고 우리는 데이터베이스와의 연결이 필요합니다 :
& NBSP; >>> 수입 CGI
& NBSP; >>> pprint 수입 pprint에서
& NBSP; >>> zope.interface 수입 구현에서
& NBSP; >>>에서 ZODB.tests.util 수입 DB
& NBSP; >>> dB = DB ()
& NBSP; >>> CONN = db.open ()
& NBSP; >>> 루트 = conn.root ()
우리의 응용 프로그램은 오라클 것을 상상해보십시오 : 당신이 문구에 반응을 가르 칠 수 있습니다. 이제 간단하게하고 DICT에 데이터를 저장하자
& NBSP; >>> 루트 [ '답변'] = { '안녕하세요': '? 안녕하세요 &가 어떻게해야합니까'
& NBSP; ...? '삶의 의미': '42',
& NBSP; ... '네 & NBSP; >>> 수입 거래
& NBSP; >>> transaction.commit ()
초기 설정
여기에 일부 세대에 특정 코드입니다. 우리는 생성하고 SchemaManager을 등록합니다. SchemaManagers는 데이터베이스의 실제 업데이트에 대한 책임이 있습니다. 이 사람은 그냥 더미 될 것입니다. 여기서 포인트는 세대가 우리의 응용 프로그램이 세대를 지원하는지 인식 모듈 확인하는 것입니다.
그것이 생성을 관리 Python 모듈을 사용하기 때문에 SchemaManager의 디폴트 구현은이 시험에 적합하지 않다. 우리가 아직 아무것도하고 싶지 않기 때문에 지금, 그것은 잘 될 것입니다.
& NBSP; >>> zope.generations.interfaces는 ISchemaManager를 가져올에서
& NBSP; >>> zope.generations.generations는 SchemaManager를 가져올에서
& NBSP; >>> 수입 zope.component
& NBSP; >>> dummy_manager = SchemaManager (minimum_generation = 0 세대 = 0)
& NBSP; >>> zope.component.provideUtility (
& NBSP; ... dummy_manager, ISchemaManager, 이름 = 'some.app')
'some.app는'고유 식별자입니다. 당신은 URI 또는​​ 패키지의 점으로 구분 된 이름을 사용해야합니다.
당신이 조프를 시작하고 데이터베이스를 열 때, 이벤트 IDatabaseOpenedWithRoot가 전송됩니다. 조프는이 이벤트의 핸들러로 기본적으로 evolveMinimumSubscriber를 등록합니다. 의이 시뮬레이션 보자 :
& NBSP; >>> 클래스 DatabaseOpenedEventStub (객체) :
& NBSP; ... 데프 __init __ (자기, 데이터베이스) :
& NBSP; ... self.database = 데이터베이스
& NBSP; >>> 이벤트 = DatabaseOpenedEventStub (dB)
& NBSP; >>> zope.generations.generations는 evolveMinimumSubscriber를 가져올에서
& NBSP; >>> evolveMinimumSubscriber (이벤트)
이 작업의 결과는 이제 데이터베이스가 현재 스키마 번호는 우리가 스키마를 업데이트 할 때, Zope3 시작점이 무엇의 아이디어가 0이됩니다 사실이 포함되어 있다는 것입니다. 여기를 참조하십시오?
& NBSP; >>> zope.generations.generations는 generations_key를 가져올에서
& NBSP; >>> 루트 [generations_key] [ 'some.app']
& NBSP 0
실제 생활에서 직접이 키를 귀찮게 할 필요가 없습니다해야하지만, 당신은 그것이 존재한다는 것을 알고 있어야합니다.
업그레이드 시나리오
위로 이야기. 일부 시간을 통과하고 우리가 HTML 특수 문자를 탈출하는 것을 잊었다 때문에 우리의 고객 중 하나가 해킹됩니다! 공포! 우리는 어떤 데이터의 손실없이 최대한 빨리이 문제를 해결해야합니다. 우리는 우리의 동료 인상을 세대를 사용하기로 결정.
의 스키마 관리자를 업데이트 (이전을 삭제하고 새 사용자 정의 하나를 설치) 보자 :
& NBSP; >>> zope.component 수입 globalregistry에서
& NBSP; >>> GSM = globalregistry.getGlobalSiteManager ()
& NBSP; >>> gsm.unregisterUtility (제공 = ISchemaManager, 이름 = 'some.app')
& NBSP 트루 (True)
& NBSP; >>> 클래스 MySchemaManager (객체) :
& NBSP; ... 구현 (ISchemaManager)
& NBSP; ...
& NBSP; ... minimum_generation = 1
& NBSP; ... 세대 = 2
& NBSP; ...
& NBSP; ... 데프 (자기 컨텍스트, 세대) 진화 :
& NBSP; ... 루트 = context.connection.root ()
& NBSP; ... 답 = 루트 [ '답변']
& NBSP; ... 경우 발생 == 1 :
& NBSP; ... 질문, answers.items 답변 () :
& NBSP; ... 답변 [질문] = 이는 cgi (답)
& NBSP; ...의 elif 세대 == 2 :
& NBSP; ... 질문, answers.items 답변 () :
& NBSP; ... 델 답변 [질문]
& NBSP; ... 답변 [이는 cgi (질문) = 대답
& NBSP; ... 다른 :
& NBSP; ( "저런")은 ValueError 인상
& NBSP; ... 루트 [ '대답'] 답변을 # 핑 지속성을 =
& NBSP; ... transaction.commit ()
& NBSP; >>> 매니저 = MySchemaManager ()
& NBSP; >>> zope.component.provideUtility (관리자, ISchemaManager, 이름 = 'some.app')
우리는 우리의 응용 프로그램이이 SchemaManager가 알고있는 최신 약 2 것을 의미 생성 속성이 2로 설정되어있는 세대 1보다 오래된 데이터베이스, 실행을 거부한다는 것을 의미 즉, 1. minimum_generation을 설정했습니다.
() 진화 주력는 여기에있다. 그 작업은 세대 1 세대로 데이터베이스를 얻을 수 있습니다. 그것은 ZODB에 연결되는 속성 '연결',이 컨텍스트를 가져옵니다. 이 예에서와 같이 객체를 변경하는 것을 사용할 수 있습니다.
(그들은 누군가에 의해 입력 할 수 있기 때문에, 중요한 말,!)이 특정 구현 세대 1은 답을 탈출, 2 세대는 질문에 탈출 (덜 중요한 말을,이 권한이 부여 personell 만 입력 할 수 있기 때문에).
사실, 당신은 정말 ISchemaManager의 정의 구현이 필요하지 않습니다. 하나는 우리가 이전에 더미를 위해 그것을 사용하고, 사용할 수 있습니다. 그것은 evolver 기능의 조직 파이썬 모듈을 사용합니다. 자세한 내용은 문서화 문자열을 참조하십시오.
실제 생활에서 당신은 여기보다 훨씬 더 복잡한 개체 구조를해야합니다. findObjectsMatching ()와 findObjectsProviding () : 당신의 인생을 쉽게하기 위해, zope.generations.utility에서 두 가지 매우 유용한 기능이 있습니다. 그들은 당신이 인터페이스 또는 다른 기준에 따라 업데이트 할 오래된 개체를 찾는 데 도움이 반복적으로 컨테이너를 통해 발굴됩니다. 그들은 그들의 문서화 문자열을 확인, 이해하기 쉽다.
행동 세대
그래서, 우리의 분노 클라이언트는 우리의 최신 코드를 다운로드하고 조프를 다시 시작합니다. 이 행사는 자동으로 다시 전송됩니다
& NBSP; >>> 이벤트 = DatabaseOpenedEventStub (dB)
& NBSP; >>> evolveMinimumSubscriber (이벤트)
나와! 클라이언트는 다시 행복하다!
& NBSP; >>> pprint (루트 [ '답변'])
& NBSP; { '안녕하세요': '안녕 및 당신은 할 어떻게?'
& NBSP; '삶의 의미?': '42',
& NBSP; '네 evolveMinimumSubscriber 매우 게으른 때문에 응용 프로그램이 사용할 수 있도록, 그것은 단지 충분한 데이터베이스를 업데이트 (minimum_generation에, 즉). 실제로, 마커는 데이터베이스 생성 한 범프로되었음을 의미 :
& NBSP; >>> 루트 [generations_key] [ 'some.app']
& NBSP 1
우리는 세대가 작동하는지 볼, 그래서 우리는 이제이가 수동으로 수행 할 수있는 방법을 알아 보자 다음 단계를 취할과 세대 2로 진화하기로 결정 :
& NBSP; >>> zope.generations.generations 진화 가져올에서
& NBSP; >>> (dB) 진화
& NBSP; >>> pprint (루트 [ '답변'])
& NBSP; { '안녕하세요': '안녕 및 당신은 할 어떻게?'
& NBSP; '삶의 의미?': '42',
& NBSP; '네 & NBSP; >>> 루트 [generations_key] [ 'some.app']
& NBSP; 2
SchemaManager에서 제공하는 최신 세대로 진화 업그레이드의 기본 동작. 당신은 당신이 업데이트해야하는 경우 또는 우리가 이전에 호출 한 가입자와 같은 게으른하려면 바로 확인 할 때) (진화 방법에 인수를 사용할 수 있습니다.
스키마 관리자의 주문
자주 제대로 작동하려면 다른 서브 시스템에 의존하는 응용 프로그램을 작성하는 데 사용 서브 시스템. 두 서브 스키마 관리자를 제공하는 경우, 그것은 evolvers가 호출 될 순서를 알고 종종 도움이된다. 이 프레임 워크를 허용하고 클라이언트가 콘서트 진화 할 수 있도록, 그리고 클라이언트 워크 전 또는 후에 자체 진화 될 것임을 알 수있다.
이 스키마 관리자 유틸리티의 이름을 제어함으로써 달성 될 수있다. 스키마 관리자는 자신의 이름을 정렬에 의해 결정된 순서로 실행됩니다.
& NBSP; >>> 관리자 1 = SchemaManager (minimum_generation = 0, 세대 = 0)
& NBSP; >>> manager2 = SchemaManager (minimum_generation = 0 세대 = 0)
& NBSP; >>> zope.component.provideUtility (
& NBSP; ... 관리자 1, ISchemaManager, 이름 = 'another.app')
& NBSP; >>> zope.component.provideUtility (
& NBSP; ... manager2, ISchemaManager, 이름 = 'another.app-확장')
첫 번째 패키지의 이름은 종속 패키지를위한 공간을 만드는 데 사용되는 방법을 알 수 있습니다. 이것은 프레임 워크의 요구 있지만 사용에 편리한 패턴이 아니다.
이들의 세대를 확립 데이터베이스 진화 보자
& NBSP; >>> 이벤트 = DatabaseOpenedEventStub (dB)
& NBSP; >>> evolveMinimumSubscriber (이벤트)
& NBSP; >>> 루트 [generations_key] [ 'another.app']
& NBSP 0
& NBSP; >>> 루트 [generations_key] [ 'another.app-확장']
& NBSP 0
몇몇의 이유로 이들 각각의 서브 시스템이 생성을 추가해야하고, 'another.app 신전'의 발생 1 'another.app'의 발생에 의존 한 것으로 가정하자. 우리는 그들이 우리가 결과를 확인할 수 있습니다 실행했습니다 각 해당 레코드에 대한 스키마 관리자를 제공해야합니다 :
& NBSP; >>> gsm.unregisterUtility (제공 = ISchemaManager, 이름 = 'another.app')
& NBSP 트루 (True)
& NBSP; >>> gsm.unregisterUtility (
& NBSP; ... 제공 = ISchemaManager, 이름 = 'another.app-확장')
& NBSP 트루 (True)
& NBSP; >>> 클래스 FoundationSchemaManager (객체) :
& NBSP; ... 구현 (ISchemaManager)
& NBSP; ...
& NBSP; ... minimum_generation = 1
& NBSP; ... 세대 = 1
& NBSP; ...
& NBSP; ... 데프 (자기 컨텍스트, 세대) 진화 :
& NBSP; ... 루트 = context.connection.root ()
& NBSP; ... 주문 = root.get ( '주문', [])
& NBSP; ... 경우 발생 == 1 :
& NBSP; ... ordering.append ( '기초 1')
& NBSP; ... 인쇄 '기초 1 세대'
& NBSP; ... 다른 :
& NBSP; ( "저런")은 ValueError 인상
& NBSP; ... 루트 [ '주문'] = 순서 # 핑 지속성
& NBSP; ... transaction.commit ()
& NBSP; >>> 클래스 DependentSchemaManager (객체) :
& NBSP; ... 구현 (ISchemaManager)
& NBSP; ...
& NBSP; ... minimum_generation = 1
& NBSP; ... 세대 = 1
& NBSP; ...
& NBSP; ... 데프 (자기 컨텍스트, 세대) 진화 :
& NBSP; ... 루트 = context.connection.root ()
& NBSP; ... 주문 = root.get ( '주문', [])
& NBSP; ... 경우 발생 == 1 :
& NBSP; ... ordering.append ( '따라 1')
& NBSP; ... 인쇄 '따라 1 세대'
& NBSP; ... 다른 :
& NBSP; ( "저런")은 ValueError 인상
& NBSP; ... 루트 [ '주문'] = 순서 # 핑 지속성
& NBSP; ... transaction.commit ()
& NBSP; >>> 관리자 1 = FoundationSchemaManager ()
& NBSP; >>> manager2 = DependentSchemaManager ()
& NBSP; >>> zope.component.provideUtility (
& NBSP; ... 관리자 1, ISchemaManager, 이름 = 'another.app')
& NBSP; >>> zope.component.provideUtility (
& NBSP; ... manager2, ISchemaManager, 이름 = 'another.app-확장')
항상 evolver evolver 'another.app-확장'전에 'another.app'를 실행 이제 데이터베이스를 진화 :
& NBSP; >>> 이벤트 = DatabaseOpenedEventStub (dB)
& NBSP; >>> evolveMinimumSubscriber (이벤트)
& NBSP; 기초 1 세대
& NBSP; 따라 1 세대
& NBSP; >>> 루트 [ '주문']
& NBSP; [ '재단 1', '1 종속']
설치
위 예에서는, 수동 응답을 초기화. 우리는 수동으로 작업을 수행 할 필요가 없습니다. 이 응용 프로그램은 자동으로 할 수 있어야합니다.
IInstallableSchemaManager는 응용 프로그램의 intial 설치를 수행하기위한 설치 방법을 제공, ISchemaManager을 확장합니다. 이 데이터베이스 열 가입자를 등록하는 것보다 더 나은 대안이다.
의 설치를 포함하는 새로운 스키마 관리자를 정의 해보자 :
& NBSP; >>> gsm.unregisterUtility (제공 = ISchemaManager, 이름 = 'some.app')
& NBSP 트루 (True)
& NBSP; >>> zope.generations.interfaces는 IInstallableSchemaManager를 가져올에서
& NBSP; >>> 클래스 MySchemaManager (객체) :
& NBSP; ... 구현 (IInstallableSchemaManager)
& NBSP; ...
& NBSP; ... minimum_generation = 1
& NBSP; ... 세대 = 2
& NBSP; ...
& NBSP; ... 데프 설치 (자기 컨텍스트) :
& NBSP; ... 루트 = context.connection.root ()
& NBSP; ... 루트 [ '답변'] = { '안녕하세요': '? 안녕하세요 &가 어떻게해야합니까'
& NBSP; ...? '삶의 의미': '42',
& NBSP; ... '네 & NBSP; ... transaction.commit ()
& NBSP; ...
& NBSP; ... 데프 (자기 컨텍스트, 세대) 진화 :
& NBSP; ... 루트 = context.connection.root ()
& NBSP; ... 답 = 루트 [ '답변']
& NBSP; ... 경우 발생 == 1 :
& NBSP; ... 질문, answers.items 답변 () :
& NBSP; ... 답변 [질문] = 이는 cgi (답)
& NBSP; ...의 elif 세대 == 2 :
& NBSP; ... 질문, answers.items 답변 () :
& NBSP; ... 델 답변 [질문]
& NBSP; ... 답변 [이는 cgi (질문) = 대답
& NBSP; ... 다른 :
& NBSP; ( "저런")은 ValueError 인상
& NBSP; ... 루트 [ '대답'] 답변을 # 핑 지속성을 =
& NBSP; ... transaction.commit ()
& NBSP; >>> 매니저 = MySchemaManager ()
& NBSP; >>> zope.component.provideUtility (관리자, ISchemaManager, 이름 = 'some.app')
이제 새 데이터베이스를 열 수 있습니다 :
& NBSP; >>> db.close ()
& NBSP; >>> dB = DB ()
& NBSP; >>> CONN = db.open ()
& NBSP; conn.root에 >>> '답변'()
& NBSP; 거짓
& NBSP; >>> 이벤트 = DatabaseOpenedEventStub (dB)
& NBSP; >>> evolveMinimumSubscriber (이벤트)
& NBSP; >>> conn.sync ()
& NBSP; >>> 루트 = conn.root ()
& NBSP; >>> pprint (루트 [ '답변'])
& NBSP; { '안녕하세요': '안녕 및 당신은 할 어떻게?'
& NBSP; '삶의 의미?': '42',
& NBSP; '네 & NBSP; >>> 루트 [generations_key] [ 'some.app']
& NBSP; 2
ZODB 트랜잭션 로그는 우리의 설치 스크립트가 실행 된 것을 노트
& NBSP; >>> [. conn.db에 대한 it.description () storage.iterator ()] [- 2]
& NBSP; u'some.app는 '세대를 설치 실행
(마이너 참고 : 두 커밋이 있기 때문에 마지막 레코드 아니다 :.. MySchemaManager 하나를 수행하고 evolveMinimumSubscriber 두 번째 하나를 수행 MySchemaManager 정말 커밋 할 필요가 없습니다)

이 릴리스의 새로운 기능입니다 :

이 파이썬 3.3에 대한 지원이 추가되었습니다.
동등한 zope.interface.implementer 데코레이터로 대체되지 zope.interface.implements 사용.
파이썬 2.4과 2.5에 대한 지원을 떨어졌다.

이 버전 3.7.1의 새로운 기능 :

이 개발 과정에서 사용하지만 Windows에서 컴파일되지 않습니다 제거 buildout 부분입니다.
생성 스크립트는 트랜잭션 메모를 추가 할 수 있습니다.

이 요구 사항 :

이 파이썬

개발자의 기타 소프트웨어 Zope Corporation and Contributors

코멘트 zope.generations

댓글을 찾을 수 없습니다
코멘트를 추가
이미지를 켜십시오!