Python-data-persistence-data-persistence-zodb

提供:Dev Guides
移動先:案内検索

データの永続性-ZODB

ZODB(* Zopeオブジェクトデータベース*)は、Pythonオブジェクトを格納するためのデータベースです。 これはACIDに準拠しています-NOSQLデータベースには機能がありません。 ZODBは、多くのNoSQLデータベースと同様に、オープンソースであり、水平方向にスケーラブルでスキーマフリーです。 ただし、これは配布されておらず、簡単な複製を提供していません。 Pythonオブジェクトの永続化メカニズムを提供します。 これはZope Applicationサーバーの一部ですが、独立して使用することもできます。

ZODBはZope CorporationのJim Fultonによって作成されました。 シンプルな永続オブジェクトシステムとして始まりました。 現在のバージョンは5.5.0で、完全にPythonで記述されています。 Pythonの組み込みオブジェクト永続性(pickle)の拡張バージョンを使用します。

ZODBの主な機能のいくつかは-

  • 取引
  • 履歴/元に戻す
  • 透過的に接続可能なストレージ
  • 組み込みキャッシュ
  • マルチバージョン同時実行制御(MVCC)
  • ネットワーク全体のスケーラビリティ

ZODBは*階層的な*データベースです。 データベースの作成時に初期化されるルートオブジェクトがあります。 ルートオブジェクトはPython辞書のように使用され、他のオブジェクトを含めることができます(それ自体が辞書のようになる可能性があります)。 オブジェクトをデータベースに保存するには、オブジェクトをコンテナ内の新しいキーに割り当てるだけで十分です。

ZODBは、データが階層的であり、書き込みよりも読み取りの方が多いアプリケーションに役立ちます。 ZODBはpickleオブジェクトの拡張です。 これが、Pythonスクリプトでのみ処理できる理由です。

ZODBの最新バージョンをインストールするには、pipユーティリティを使用します-

pip install zodb

次の依存関係もインストールされています-

  • BTrees == 4.6.1
  • cffi == 1.13.2
  • 永続的== 4.5.1
  • pycparser == 2.19
  • 6 == 1.13.0
  • トランザクション== 2.4.0

ZODBは次のストレージオプションを提供します-

ファイルストレージ

これがデフォルトです。 すべてが1つの大きなData.fsファイルに保存されます。これは基本的にトランザクションログです。

DirectoryStorage

オブジェクトリビジョンごとに1つのファイルを保存します。 この場合、クリーンでないシャットダウン時にData.fs.indexを再構築する必要はありません。

RelStorage

これは、ピクルスをリレーショナルデータベースに格納します。 PostgreSQL、MySQL、Oracleがサポートされています。

ZODBデータベースを作成するには、ストレージ、データベース、そして最後に接続が必要です。

最初のステップは、ストレージオブジェクトを持つことです。

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')

DBクラスは、このストレージオブジェクトを使用してデータベースオブジェクトを取得します。

db = ZODB.DB(storage)

NoneをDBコンストラクターに渡して、メモリ内データベースを作成します。

Db=ZODB.DB(None)

最後に、データベースとの接続を確立します。

conn=db.open()

次に、接続オブジェクトにより、「root()」メソッドを使用してデータベースの「ルート」にアクセスできます。 「ルート」オブジェクトは、すべての永続オブジェクトを保持する辞書です。

root = conn.root()

たとえば、次のようにルートオブジェクトに生徒のリストを追加します-

root['students'] = ['Mary', 'Maya', 'Meet']

この変更は、トランザクションをコミットするまでデータベースに永続的に保存されません。

import transaction
transaction.commit()

ユーザー定義クラスのオブジェクトを格納するには、クラスをpersistent.Persistent親クラスから継承する必要があります。

サブクラス化の利点

永続クラスをサブクラス化すると、次のような利点があります-

  • データベースは、属性の設定によって行われたオブジェクトの変更を自動的に追跡します。
  • データは独自のデータベースレコードに保存されます。
  • Persistentをサブクラス化しないデータを保存できますが、それはそれを参照する永続オブジェクトのデータベースレコードに保存されます。 非永続オブジェクトはそれらを含む永続オブジェクトによって所有され、複数の永続オブジェクトが同じ非永続サブオブジェクトを参照する場合、それらは独自のコピーを取得します。

以下のように永続クラスをサブクラス化する学生クラスを定義してみましょう-

import persistent
   class student(persistent.Persistent):
   def __init__(self, name):
      self.name = name
   def __repr__(self):
      return str(self.name)

このクラスのオブジェクトを追加するには、最初に上記のように接続を設定します。

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()

オブジェクトの宣言、ルートへの追加、トランザクションのコミット

s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()

ルートオブジェクトはビルトインディクショナリに似ているため、ルートに追加されたすべてのオブジェクトのリストは、items()メソッドを使用してビューオブジェクトとして取得できます。

print (root.items())
ItemsView({'s1': Akash})

ルートから特定のオブジェクトの属性を取得するには、

print (root['s1'].name)
Akash

オブジェクトは簡単に更新できます。 ZODB APIは純粋なPythonパッケージであるため、外部SQLタイプ言語を使用する必要はありません。

root['s1'].name='Abhishek'
import transaction
transaction.commit()

データベースは即座に更新されます。 トランザクションクラスは、SQLのrollback()トランザクション制御に類似したabort()関数も定義することに注意してください。