anydbm - Zugriff auf DBM-artige Datenbanken

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.

Anlegen einer neuen Datenbank

Das Speicherformat einer neuen Datenbank wird über das Nachschlagen der Module in der folgenden Reihenfolge bestimmt:

  • dbhash
  • gdm
  • dbm
  • dumbdbm
  • 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'.

    import anydbm

    db = anydbm.open('/tmp/beispiel.db', 'n')
    db['Schluessel'] = 'Wert'
    db['Heute'] = 'Sonntag'
    db['Autor'] = 'Doug'
    db.close()

    In diesem Beispiel wird die Datei immer neu initialisiert. Um herauszufinden, welcher Datenbanktyp erstellt wurde können wir das whichdb Modul nutzen.

    import whichdb

    print whichdb.whichdb('/tmp/beispiel.db')

    Die Ergebnisse können abhängig von den installierten Modulen variieren.

    $ python anydbm_whichdb.py
    dbhash

    Öffnen einer neuen Datenbank

    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.

    import anydbm

    db = anydbm.open('/tmp/beispiel.db', 'r')
    try:
        print 'keys():', db.keys()
        for k, v in db.iteritems():
            print 'iteriere:', k, v
        print 'db["Autor"] =', db['Autor']
    finally:
        db.close()

    Einmal geöffnet, db ist ein Dictionary-ähnliches Objekt, mit Unterstützung für die üblichen Methoden.

    $ python anydbm_existing.py
    keys(): ['Schluessel', 'Heute', 'Autor']
    iteriere: Schluessel Wert
    iteriere: Heute Sonntag
    iteriere: Autor Doug
    db["Autor"] = Doug

    Fehlerfälle

    Die Schlüssel der Datenbank müssen Strings sein.

    import anydbm

    db = anydbm.open('/tmp/beispiel.db', 'w')
    try:
        db[1] = 'eins'
    finally:
        db.close()

    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.

    import anydbm

    db = anydbm.open('/tmp/beispiel.db', 'w')
    try:
        db['eins'] = 1
    finally:
        db.close()

    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, in 
        db['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.
                


    Siehe auch

    Modul shelve

    Beispiele für das shelve Modul, welches anydbm benutzt, um Daten zu speichern.

    anydbm

    Die Standart Library Dokumenation für dieses Modul.