ZODB のインストールと Python プログラム例(Ubuntu 上)
公式ドキュメント: https://zodb.org/
前準備
Ubuntu のシステム更新
Ubuntu で OS のシステム更新を行うときは, 端末で,次のコマンドを実行する。これは、パッケージ情報を最新の状態に保ち、インストール済みのパッケージをセキュリティアップデートやバグ修正を含めて更新するためである。
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# カーネル更新等で実際に再起動が必要な場合のみ実行を推奨
# sudo shutdown -r now
Python3 開発用ファイル,pip, setuptools, venv のインストール(Ubuntu 上)
Python のインストールは行わない(Ubuntu のシステム Python を用いる.)
Ubuntu のシステム Python を用いるとき, python, pip は,次のコマンドで起動できる.
- python3 (Ubuntu のシステム Python)
- pip3 (pip 3)
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