データの永続化と変換¶
Python はデータを保存するための複数のモジュールを提供します。基本的に永続化は2つの様相があります。1つはインメモリオブジェクトを変換して保存用フォーマットにする、もう1つは変換されたデータのストレージと連携することです。
オブジェクトをシリアライズする¶
Python は、通信可能または保存可能なフォーマットにオブジェクトを変換 (シリアライズ) できる2つのモジュール pickle と json を提供します。最も一般的なのは pickle です。というのは、高速な C 言語実装があり、 shelve のように他の標準ライブラリで実際にデータをシリアライズして保存するのに利用されているからです。web ベースのアプリケーションは、既存の web サービスのストレージアプリケーションと連携するのに適した json を調べると良いです。
シリアライズされたオブジェクトを保存する¶
インメモリオブジェクトを保存可能なフォーマットに変換したら、次はそのデータを保存する方法を決めます。後続の処理においてインデクシングする必要がないデータなら、シリアライズされたオブジェクトを単純にファイルへ書き込みます。しかし、Python は DBM フォーマットの一種としてキーバリューを保存するシンプルなデータベースのために複数のモジュールを提供します。
shelve は DBM フォーマットを活用する最もシンプルなインタフェースです。shelve ファイルを単純にオープンして、ディクショナリのような API でアクセスします。shelve ファイルに保存するオブジェクトは自動的に pickle 化されて、特に意識する必要はありません。
shelve の欠点の1つは、デフォルトのインタフェースでどの DBM フォーマットを使用するかを指定できないことです。そのことは、アプリケーションが異なるライブラリ間や複数ホスト間でデータベースファイルを共有する必要がない場合は大した問題ではあありません。しかし、そうした必要性がある場合、モジュールのクラスの1つを選択して特定のフォーマットを指定できます(特別なシェルフ)。
もし JSON 経由で大量データを渡す必要があるなら json と anydbm を使用して別の永続化の仕組みを提供します。DBM データベースのキーと値は文字列でなければならないので、データベースの値にアクセスするときにそのオブジェクトが自動的に再作成されることはありません。
関係データベース¶
sqlite3 という優れたインプロセス関係データベースがほとんどの Python 環境で利用できます。それはメモリまたはローカルファイルにデータベースを保存します。そして、全てのアクセスが同一プロセス内から行われるのでネットワークの遅延がありません。小型軽量な特徴をもつ sqlite3 は特にデスクトップアプリケーションの組み込み用途や web アプリケーションの開発バージョンに適しています。
データベースへの全てのアクセスは Python DBI 2.0 API を経由して行われます。デフォルトでは、オブジェクト関係マッパ(ORM)は提供されません。
最も汎用的で人気のある ORM は SQLAlchemy です。しかし、Django のネイティブ ORM もまた SQLite をサポートします。SQLAlchemy のインストールと設定は簡単ですが、対象アプリケーションのオブジェクトがあまり複雑ではない、もしくはそのオーバーヘッドが気になるなら、直接 DBI インタフェースを使用した方が良いかもしれません。