Link zu Doug Hellmanns Original Artikel
| Zweck: | Dictionary ähnliches Interface zu DBM - Datenbanken |
| Python: | ab 1.4 |
anydbm ist ein Front-End für DBM Datenbanken, die einfache Zeichenketten als Schlüsselwort für den Zugriff auf aus Strings bestehende Datensätze benutzen. Es benutzt das wichdb Modul um dbhash, gdm und dbm Datenbanken zu erkennen und sie mit dem passenden Modul zu öffnen. Es wird als Backend für shelve genutzt, welches wiederum weiß, wie Objekte mittels pickle gespeichert werden.
Das Speicherformat einer neuen Datenbank wird über das Nachschlagen der Module in der folgenden Reihenfolge bestimmt:
Die open() Funktion akzeptiert flags, die die Verwaltung der Datenbank regeln. Um eine neue Datenbank anzulegen, benutzt man 'c', um immer eine neue Datenbank anzulegen, benutze 'n'.
In diesem Beispiel wird die Datei immer neu initialisiert. Um herauszufinden, welcher Datenbanktyp erstellt wurde können wir das whichdb Modul nutzen.
Die Ergebnisse können abhängig von den installierten Modulen variieren.
Um bestehende Datenbanken zu öffnen benutze flags wie 'r' - nur lesen oder 'w' - für Lesen und Schreiben. Um bestehende Formate musst Du Dir keine Sorgen machen, weil bestehende Datenbanken automatisch durch whichdb identifiziert werden. Wenn eine Datei erkannt wird, wird automatisch das passende Modul zum Öffnen verwendet.
Einmal geöffnet, db ist ein Dictionary-ähnliches Objekt, mit Unterstützung für die üblichen Methoden.
Die Schlüssel der Datenbank müssen Strings sein.
Wir ein anderer Typ übergeben wird ein TypeError geworfen.
$ python anydbm_intkeys.py
Traceback (most recent call last):
File "/Users/dhellmann/Documents/PyMOTW/in_progress/anydbm/PyMOTW/anydbm/anydbm_intkeys.py", line 16, in
db[1] = 'eins'
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/bsddb/__init__.py", line 230, in __setitem__
_DeadlockWrap(wrapF) # self.db[key] = value
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/bsddb/dbutils.py", line 62, in DeadlockWrap
return function(*_args, **_kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/bsddb/__init__.py", line 229, in wrapF
self.db[key] = value
TypeError: Integer keys only allowed for Recno and Queue DB's
Werte müssen Strings oder None sein.
Ein ähnlicher TypeError wird geworfen, wenn der Wert kein String ist.
$ python anydbm_intvalue.py Traceback (most recent call last): File "/Users/dhellmann/Documents/PyMOTW/in_progress/anydbm/PyMOTW/anydbm/anydbm_intvalue.py", line 16, indb['eins'] = 1 File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/bsddb/__init__.py", line 230, in __setitem__ _DeadlockWrap(wrapF) # self.db[key] = value File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/bsddb/__init__.py", line 229, in wrapF self.db[key] = value TypeError: Data values must be of type string or None.