anydbm – DBM スタイルのデータベースへのアクセス¶
目的: | anydbm は DBM スタイルという文字列をキーとするデータベースに対してディクショナリによく似たインタフェースを提供する |
---|---|
利用できるバージョン: | 1.4 以上 |
anydbm モジュールは、文字列を含むレコードへアクセスするためにシンプルな文字列をキーとする DBM スタイルのデータベースのフロントエンドです。それは whichdb モジュールで dbhash, gdbm, dbm の中からデータベースを識別して、その適切なモジュールでデータベースをオープンします。そして pickle でオブジェクトを格納する shelve モジュールのバックエンドとして使用されます。
新たなデータベースを作成する¶
新しいデータベースのストレージフォーマットは次の順番でそれぞれのモジュールを調べて選択されます。
open() 関数は、データベースファイルを管理するために flags を取ります。必要に応じて新たなデータベースを作成するには 'c' を、毎回新たなデータベースを作成するには 'n' を使用してください。
import anydbm
db = anydbm.open('/tmp/example.db', 'n')
db['key'] = 'value'
db['today'] = 'Sunday'
db['author'] = 'Doug'
db.close()
$ python anydbm_new.py
このサンプルでは、example.db のファイルは毎回、初期化されます。どのデータベースが作成されるかを調べるには whichdb を使用します。
import whichdb
print whichdb.whichdb('/tmp/example.db')
実行環境にインストールされたモジュール次第で実行結果は変わる可能性があります。
$ python anydbm_whichdb.py
dbhash
既存のデータベースをオープンする¶
既存のデータベースをオープンするには、 flags に 'r' (読み込み専用)か 'w' (読み書き) のどちらかを指定してください。既存のデータベースは自動的に whichdb で識別されるのでフォーマットに関して心配する必要はありません。ファイルが識別されると、適切なモジュールがそのファイルをオープンするために使用されます。
import anydbm
db = anydbm.open('/tmp/example.db', 'r')
try:
print 'keys():', db.keys()
for k, v in db.iteritems():
print 'iterating:', k, v
print 'db["author"] =', db['author']
finally:
db.close()
オープンされた db はディクショナリによく似たオブジェクトで、ディクショナリで普通に使うメソッドをサポートしています。
$ python anydbm_existing.py
keys(): ['author', 'key', 'today']
iterating: author Doug
iterating: key value
iterating: today Sunday
db["author"] = Doug
エラーケース¶
データベースのキーは文字列でなければなりません。
import anydbm
db = anydbm.open('/tmp/example.db', 'w')
try:
db[1] = 'one'
except TypeError, err:
print '%s: %s' % (err.__class__.__name__, err)
finally:
db.close()
文字列以外の型を渡すと TypeError が発生します。
$ python anydbm_intkeys.py
TypeError: Integer keys only allowed for Recno and Queue DB's
値は文字列か None でなければなりません。
import anydbm
db = anydbm.open('/tmp/example.db', 'w')
try:
db['one'] = 1
except TypeError, err:
print '%s: %s' % (err.__class__.__name__, err)
finally:
db.close()
値が文字列ではない場合も TypeError が発生します。
$ python anydbm_intvalue.py
TypeError: Data values must be of type string or None.
See also
- Module shelve
- データを格納するために anydbm を使用する shelve モジュールのサンプル
- anydbm
- 本モジュールの標準ライブラリドキュメント
- データの永続化と変換
- データを格納するその他のモジュールの説明