zope.generations

ソフトウェアのスクリーンショット:
zope.generations
ソフトウェアの詳細:
バージョン: 4.0.0 Alpha 1
日付のアップロード: 15 Apr 15
ライセンス: 無料
人気: 2

Rating: nan/5 (Total Votes: 0)

zope.generationsは、データベース内のオブジェクトを更新する方法を提供したときに、アプリケーション·スキーマの変更 アプリケーション·スキーマは、基本的にデータの構造、ZODB例または例のテーブルの記述のクラスの構造であり、リレーショナルデータベース。
の詳細なドキュメント
世代は、データベース、アプリケーションのスキーマの変更でオブジェクトを更新する方法です。アプリケーションスキーマZODBやリレーショナルデータベースの場合は表の記述例では、基本的にデータの構造、クラスの構造である。
あなたは、アプリケーションのデータ構造を変更すると、たとえば、クラス内の既存のフィールドの意味を変更し、あなたの変更前に作成したデータベースに問題があります。さらに詳細な説明と可能な解決策については、http://wiki.zope.org/zope3/DatabaseGenerationsを参照してください。
私たちは、コンポーネント·アーキテクチャーを使用する、と私たちは、データベースとの接続が必要になります。
  >>>インポートCGI
  >>> PPRINT輸入PPRINTから
  >>> zope.interface輸入実装から
  >>> ZODB.tests.util輸入DBから
  >>> DB = DB()
  >>> CONN = db.open()
  >>>ルート= conn.root()
私たちのアプリケーションがOracleであることを想像して:あなたはフレーズに反応することを教えることができます。それをシンプルに保ち、辞書にデータを保存してみましょう:
&NBSPに、>>>ルート['答え'] = {'こんにちは': 'こんにちは&あなたはどのように行うのですか?」、
  ... '?人生の意味': '42'、
&NBSP; ... "4 <? ':' 4 <5 '}
&NBSP; >>>輸入取引
&NBSP; >>>ます。Transaction.commit()
の初期設定
ここではいくつかの世代に固有のコードです。私たちは、SchemaManagerのを作成し、登録します。 SchemaManagersは、データベースの実際の更新をする責任があります。この1はちょうどダミーとなります。ここでのポイントは、世代が私たちのアプリケーションは、世代をサポートしていることを認識モジュールにすることです。
それは世代を管理するための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またはあなたのパッケージのドット名を使用する必要があります。
もしZopeを起動して、データベースが開かれたときに、イベントIDatabaseOpenedWithRootが送信される。 Zopeはこのイベントのハンドラとして、デフォルトでevolveMinimumSubscriberを登録します。それではこれをシミュレートしてみましょう:
&NBSP; >>>クラスDatabaseOpenedEventStub(オブジェクト):
&NBSP; ...デフ__init __(自己、データベース):
&NBSP; ... self.database =データベース
&NBSP; >>>イベント= DatabaseOpenedEventStub(DB)
&NBSP;は>>> zope.generations.generationsからevolveMinimumSubscriberをインポート
&NBSP; >>> evolveMinimumSubscriber(イベント)
この作用の結果は、現在のデータベースは、我々は、スキーマを更新すると私たちの現在のスキーマ番号が0であるという事実が含まれている、Zope3は出発点が何であったかのアイデアを持っているということです。ここでは、参照してください?
&NBSP;は>>> zope.generations.generationsからgenerations_keyをインポート
&NBSP; >>>ルート[generations_key] ['some.app']
&NBSP; 0
実生活では、直接、このキーを気にする必要はありません必要がありますが、あなたはそれが存在することに注意する必要があります。
のアップグレードシナリオ
バックストーリーへ。いくつかの時間が経過し、我々はHTMLの特殊文字をエスケープするのを忘れたので、私たちのクライアントのいずれかがハッキングされます!恐怖!私たちは、すべてのデータを失うことなく、できるだけ早くこの問題を解決する必要があります。私たちは、私たちの仲間を感動させるの世代を使用することを決定。
の(古いものを削除して、新しいカスタム1をインストール)スキーママネージャを更新してみましょう:
&NBSP; >>> zope.component輸入globalregistryから
&NBSP; >>> GSM = globalregistry.getGlobalSiteManager()
&NBSP; >>> gsm.unregisterUtility(提供= ISchemaManager、名前= 'some.app')
&NBSP;真
&NBSP; >>>クラスMySchemaManager(オブジェクト):
&NBSP; ...実装(ISchemaManager)
&NBSP; ...
&NBSP; ... minimum_generation = 1
&NBSP; ...世代= 2
&NBSP; ...
&NBSP; ... DEF(自己、コンテキスト、世代)進化:
&NBSP; ...ルート= context.connection.root()
&NBSP; ...回答=ルート['答え']
&NBSP; ...もし世代== 1:
&NBSP; ...質問に対して、)(answers.itemsに答える:
&NBSP; ...回答[質問] = cgi.escape(答え)
&NBSP; ...のelif世代== 2:
&NBSP; ...質問に対して、)(answers.itemsに答える:
&NBSP; ...デルの回答[質問]
&NBSP; ...回答[cgi.escape(質問)] =答え
&NBSP; ...それ以外:
&NBSP; ...( "残念")送出を上げる
&NBSP; ...ルート['答え']の回答の#ピング永続性を=
&NBSP; ...ます。Transaction.commit()
&NBSP; >>>マネージャー= MySchemaManager()
&NBSP; >>> zope.component.provideUtility(マネージャー、ISchemaManager、名前= 'some.app')
私たちは、アプリケーションがこのSchemaManagerのは知っている最新世代は約2であることを意味世代の属性が2に設定されている世代1より古いデータベースと実行を拒否しますことを意味することを1にminimum_generationを設定している。
()進化する働き者はこちらです。その仕事は、代々-1からデータベースを取得することです。それはZODBへの接続である属性「接続」を、持ってコンテキストを取得します。この例のようにオブジェクトを変更するためにそれを使用することができる。
(彼らは誰でも入力することができますので、たとえば、クリティカル、!)この特定の実装の生成1で回答をエスケープします(これらは、許可personellのみによって入力することができるので、それほど重要で言う、)、世代2が質問をエスケープします。
実際には、あなたは本当にISchemaManagerのカスタム実装を必要としません。一つは、私たちが以前にダミーのためにそれを使用している、使用可能です。それは、Evolverの機能の組織のためのPythonモジュールを使用しています。詳細については、そのドキュメント文字列を参照してください。
実生活では、ここに1よりもはるかに複雑なオブジェクト構造を持つことになります。 findObjectsMatching()とfindObjectsProviding():あなたの人生を容易にするために、zope.generations.utilityで利用可能な2つの非常に便利な機能があります。彼らはあなたがインターフェイスによって、またはいくつかの他の基準により、更新したい古いオブジェクトを模索助けるために再帰的にコンテナを掘るします。彼らは彼らのドキュメンテーション文字列をチェックして、理解しやすいです。
アクションのの世代
だから、私たちの猛烈なクライアントは、私たちの最新のコードをダウンロードし、Zopeを再起動します。イベントは、自動的に再送信されます。
&NBSP; >>>イベント= DatabaseOpenedEventStub(DB)
&NBSP; >>> evolveMinimumSubscriber(イベント)
ジャーン!クライアントが再び幸せです!
&NBSP; >>> PPRINT(ルート['答え'])
&NBSP; {'こんにちは': '?あなたはどのように行うのですか&ハイ」、
&NBSP; '人生の意味?': '42'、
&NBSP; '4 <?': '4 <5'}
evolveMinimumSubscriberは非常に怠惰であるため、アプリケーションがそれを使用できるように、それだけで十分なだけのデータベースを更新する(minimum_generationに、つまり)。実際、マーカーは、データベース生成が1にバンプされていることを示す。
&NBSP; >>>ルート[generations_key] ['some.app']
&NBSP; 1
私たちは、世代が働いていることがわかり、私たちは次のステップを取るとのこれが手動で行うことができる方法を見てみましょう世代2へと進化することにした。
&NBSP; >>> zope.generations.generationsは進化インポートから
&NBSP; >>>(DB)進化する
&NBSP; >>> PPRINT(ルート['答え'])
&NBSP; {'こんにちは': '?あなたはどのように行うのですか&ハイ」、
&NBSP; '人生の意味?': '42'、
&NBSP; '4 <?': '4 <5'}
&NBSP; >>>ルート[generations_key] ['some.app']
&NBSP; 2
SchemaManagerの提供する最新世代に進化のアップグレードのデフォルトの動作。あなたが更新する必要がある場合、またはあなたは私たちが以前に呼び出されている加入者のような怠け者になりたい場合は、単にチェックしたいときは、()に進化する方法を引数を使用することができます。
スキーママネージャのの注文
よくある正常に動作するように、他のサブシステムに依存しているアプリケーションを作成するために使用されるサブシステム。両方のサブシステムは、スキーママネージャを提供する場合、それは多くの場合evolversが呼び出される順序を知っていると便利です。これは、フレームワークを可能にし、それがコンサートで進化することができるようにクライアントだし、クライアントは、フレームワークの前または自体の後に進化されることを知ることができる。
これは、スキーママネージャユーティリティの名前を制御することによって達成することができる。スキーマの管理者は、自分の名前をソートすることによって決定される順序で実行されます。
&NBSP; >>> MANAGER1 = SchemaManagerの(minimum_generation = 0、世代= 0)
&NBSP; >>>マネージャ2 = SchemaManagerの(minimum_generation = 0、世代= 0)
&NBSP; >>> zope.component.provideUtility(
&NBSP; ... MANAGER1、ISchemaManager、名前= 'another.app')
&NBSP; >>> zope.component.provideUtility(
&NBSP; ...マネージャ2、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」の第1世代に依存していることを仮定しよう。我々は、彼らがそのように私たちは結果を確認することができます実行してきた各そのレコードのスキーママネージャを提供する必要があります:
&NBSP; >>> gsm.unregisterUtility(提供= ISchemaManager、名前= 'another.app')
&NBSP;真
&NBSP; >>> gsm.unregisterUtility(
&NBSP; ...提供= ISchemaManager、名前= 'another.app-拡張子')
&NBSP;真
&NBSP; >>>クラスFoundationSchemaManager(オブジェクト):
&NBSP; ...実装(ISchemaManager)
&NBSP; ...
&NBSP; ... minimum_generation = 1
&NBSP; ...世代= 1
&NBSP; ...
&NBSP; ... DEF(自己、コンテキスト、世代)進化:
&NBSP; ...ルート= context.connection.root()
&NBSP; ...発注= root.get( '発注'、[])
&NBSP; ...もし世代== 1:
&NBSP; ... ordering.append( '土台1')
&NBSP; ...印刷」基礎の生成1 '
&NBSP; ...それ以外:
&NBSP; ...( "残念")送出を上げる
&NBSP; ...ルート['発注'] =発注#ピングの持続性
&NBSP; ...ます。Transaction.commit()
&NBSP; >>>クラスDependentSchemaManager(オブジェクト):
&NBSP; ...実装(ISchemaManager)
&NBSP; ...
&NBSP; ... minimum_generation = 1
&NBSP; ...世代= 1
&NBSP; ...
&NBSP; ... DEF(自己、コンテキスト、世代)進化:
&NBSP; ...ルート= context.connection.root()
&NBSP; ...発注= root.get( '発注'、[])
&NBSP; ...もし世代== 1:
&NBSP; ... ordering.append( '依存1')
&NBSP; ...印刷」依存世代1」
&NBSP; ...それ以外:
&NBSP; ...( "残念")送出を上げる
&NBSP; ...ルート['発注'] =発注#ピングの持続性
&NBSP; ...ます。Transaction.commit()
&NBSP; >>> MANAGER1 = FoundationSchemaManager()
&NBSP; >>>マネージャ2 = DependentSchemaManager()
&NBSP; >>> zope.component.provideUtility(
&NBSP; ... MANAGER1、ISchemaManager、名前= 'another.app')
&NBSP; >>> zope.component.provideUtility(
&NBSP; ...マネージャ2、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;真
&NBSP;は>>> zope.generations.interfacesからIInstallableSchemaManagerをインポート
&NBSP; >>>クラスMySchemaManager(オブジェクト):
&NBSP; ...実装(IInstallableSchemaManager)
&NBSP; ...
&NBSP; ... minimum_generation = 1
&NBSP; ...世代= 2
&NBSP; ...
&NBSP; ... DEF(自己、コンテキスト)をインストールします。
&NBSP; ...ルート= context.connection.root()
&NBSP; ...ルート['答え'] = {'こんにちは': 'こんにちは&あなたはどのように行うのですか?」、
&NBSP; ... '?人生の意味': '42'、
&NBSP; ... "4 <? ':' 4 <5 '}
&NBSP; ...ます。Transaction.commit()
&NBSP; ...
&NBSP; ... DEF(自己、コンテキスト、世代)進化:
&NBSP; ...ルート= context.connection.root()
&NBSP; ...回答=ルート['答え']
&NBSP; ...もし世代== 1:
&NBSP; ...質問に対して、)(answers.itemsに答える:
&NBSP; ...回答[質問] = cgi.escape(答え)
&NBSP; ...のelif世代== 2:
&NBSP; ...質問に対して、)(answers.itemsに答える:
&NBSP; ...デルの回答[質問]
&NBSP; ...回答[cgi.escape(質問)] =答え
&NBSP; ...それ以外:
&NBSP; ...( "残念")送出を上げる
&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はFalse
&NBSP; >>>イベント= DatabaseOpenedEventStub(DB)
&NBSP; >>> evolveMinimumSubscriber(イベント)
&NBSP; >>> conn.sync()
&NBSP; >>>ルート= conn.root()
&NBSP; >>> PPRINT(ルート['答え'])
&NBSP; {'こんにちは': '?あなたはどのように行うのですか&ハイ」、
&NBSP; '人生の意味?': '42'、
&NBSP; '4 <?': '4 <5'}
&NBSP; >>>ルート[generations_key] ['some.app']
&NBSP; 2
私たちのインストールスクリプトが実行されたZODBのトランザクション·ログ·ノート
&NBSP; >>> [conn.dbでそれのためのit.description()storage.iterator()。] [ - 2]
&NBSP; u'some.app:世代をインストールし実行している」
(マイナー注:2のコミットがあるので、それが最後のレコードではありません:MySchemaManagerは1を実行し、evolveMinimumSubscriberは第二1を実行しMySchemaManagerが本当にコミットする必要はありません。)

の新機能<このリリースで> /強い:ます。

  • はPython 3.3のサポートが追加されました。
  • は同等のzope.interface.implementerデコレータと非推奨zope.interface.implementsの使用状況を置き換えます。
  • はPython 2.4と2.5のサポートをドロップします。

の何が新しいの中で、バージョン3.7.1:開発中に使用されるがいた。

  • を削除ビルドアウト部分Windows上でコンパイルできません。
  • 生成スクリプトは、トランザクションメモを追加します。

の要件

  • のPythonます。

開発者の他のソフトウェア Zope Corporation and Contributors

zc.zservertracelog
zc.zservertracelog

14 Apr 15

zope.browsermenu
zope.browsermenu

20 Feb 15

zope.errorview
zope.errorview

11 May 15

へのコメント zope.generations

コメントが見つかりません
コメントを追加
画像をオンにする!