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
本モジュールの標準ライブラリドキュメント
データの永続化と変換
データを格納するその他のモジュールの説明
Bookmark and Share