ZODB のインストールと Python プログラム例(Ubuntu 上)

ZODB (Zope Object Database) は,Python のオブジェクトをそのまま永続化できるオブジェクトデータベースである。ACID トランザクションをサポートし,データの格納先(ストレージ)はプラグイン方式で,メモリ上,ローカルファイル,リモートのデータベースサーバなどを選べる。SQL のような問い合わせ言語はもたず,オブジェクトの属性や要素をたどることでデータにアクセスする。

公式ドキュメント: https://zodb.org/

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行うときは, 端末で,次のコマンドを実行する。これは、パッケージ情報を最新の状態に保ち、インストール済みのパッケージをセキュリティアップデートやバグ修正を含めて更新するためである。

Ubuntu のインストールはこちらの別ページで説明する。

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# カーネル更新等で実際に再起動が必要な場合のみ実行を推奨
# sudo shutdown -r now

Python3 開発用ファイル,pip, setuptools, venv のインストール(Ubuntu 上)

Python のインストールは行わない(Ubuntu のシステム Python を用いる.)

Python, pip のコマンドでの起動のまとめ.

Ubuntu のシステム Python を用いるとき, python, pip は,次のコマンドで起動できる.

Ubuntu での Python 開発環境(JupyterLab, spyder, nteract)のインストール: 別ページ »で説明

Python3 開発用ファイル,pip, setuptools, venv のインストール

端末で,次のコマンドを実行する.

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install python-is-python3 python3-dev python-dev-is-python3 python3-pip python3-setuptools python3-venv build-essential

ZODB のインストール

Ubuntu 23.04 以降のシステム Python は 外部管理環境 (externally managed environment) として扱われ,sudo pip3 install によるシステム全体へのインストールはエラー(externally-managed-environment)になる。仮想環境 (venv) を作って,その中にインストールする。端末で,次のコマンドを実行する。

python3 -m venv ~/zodbenv
source ~/zodbenv/bin/activate
pip install ZODB

以後,この仮想環境の Python を使うときは,source ~/zodbenv/bin/activate を実行する。仮想環境から抜けるときは deactivate を実行する。

ZODB のプログラムを動かしてみる

公式のチュートリアル https://zodb.org/en/latest/tutorial.html に記載されている Account クラスの例を使用する。 ZODB では,永続化したいクラスを persistent.Persistent のサブクラスとして定義する。属性の変更は自動的に追跡され,transaction.commit() によりデータが確定して保存される(transaction.abort() で変更を破棄できる)。 多数のオブジェクトを格納するときは,スケーラブルなコンテナである BTree を使う。

import persistent
import transaction
import ZODB, ZODB.FileStorage
import BTrees.OOBTree

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

# ローカルファイル mydata.fs にデータを格納する
storage = ZODB.FileStorage.FileStorage('mydata.fs')
db = ZODB.DB(storage)
connection = db.open()
root = connection.root

# オブジェクトを1つ作り、データベースに格納する
root.accounts = BTrees.OOBTree.BTree()
root.accounts['account-1'] = Account()
root.accounts['account-1'].deposit(100.0)

# トランザクションのコミットにより、変更が永続化される
transaction.commit()

print(root.accounts['account-1'].balance)

上のプログラムを account.py のようにファイルに保存して実行する。永続化するクラスは,モジュール名とクラス名がデータベースに記録されるため,対話セッション内ではなく名前の付いたモジュール(ファイル)内で定義する

python3 account.py