anydbm - Accesso ai database in stile DBM

Scopo anydbm fornisce una interfaccia generica tipo dizionario ai database in stile DBM con chiavi a stringa
Versione Python 1.4 e superiore

anydbm è un front-end per database in stile DBM che usa semplici valori stringa come chiavi per accedere ai record. Usa il modulo whichdb per identificare i database dbhash, gbdm e dbm, quindi li apre con il modulo appropriato. Esso viene usato come back-end per shelve che a sua volta sa come conservare oggetti usando pickle.

Creare un Nuovo Database

Il formato di conservazione per i nuovi database viene selezionato cercando nell'ordine ognuno di questi moduli

La funzione open() richiede flags per controllare come viene gestito il database. Per creare un nuovo database quando necessario, si usa 'c'. Per creare sempre un nuovo database si usa 'n'

import anydbm

db = anydbm.open('/tmp/esempio.db', 'n')
db['chiave'] = 'valore'
db['oggi'] = 'Domenica'
db['autore'] = 'Doug'
db.close()
$ python anydbm_new.py

In questo esempio, il file viene sempre reinizializzato. Per vedere quale tipo di database è stato creato si può usare whichdb

import whichdb

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

Il risultato può variare, in dipendenza di quali moduli siano installati nel proprio sistema.

$ python anydbm_whichdb.py
dbhash

Aprire un Database Esistente

Per aprire un database esistente si usano i flag 'r' (per sola lettura) oppure 'w' (per lettura-scrittura). Non occorre preoccuparsi del formato, poichè i database esistenti vengono automaticamente passati a whichdb per essere identificati. Se un file può essere identificato, viene usato l'appropriato modulo per aprirlo

import anydbm

db = anydbm.open('/tmp/esempio.db', 'r')
try:
    print 'chiavi():', db.keys()
    for k, v in db.iteritems():
        print 'iterazione:', k, v
    print 'db["autore"] =', db['autore']
finally:
    db.close()

Una volta aperto, db è un oggetto tipo dizionario, con supporto per i metodi abituali:

$ python anydbm_existing.py
chiavi(): ['autore', 'chiave', 'oggi']
iterazione: autore Doug
iterazione: chiave value
iterazione: oggi Sunday
db["autore"] = Doug

Casi di Errore

Le chiavi del database devono essere stringhe.

import anydbm

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

Il passare un altro tipo risulta in un TypeError.

$ python anydbm_intkeys.py
Traceback (most recent call last):
  File "anydbm_intkeys.py", line 8, in 
    db[1] = 'uno'
  File "/usr/lib/python2.6/bsddb/__init__.py", line 276, in __setitem__
    _DeadlockWrap(wrapF)  # self.db[key] = value
  File "/usr/lib/python2.6/bsddb/dbutils.py", line 68, in DeadlockWrap
    return function(*_args, **_kwargs)
  File "/usr/lib/python2.6/bsddb/__init__.py", line 275, in wrapF
    self.db[key] = value
TypeError: Integer keys only allowed for Recno and Queue DB's

I valori devono essere stringhe o None

import anydbm

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

Un TypeError simile viene sollevato se il valore non è una stringa

$ python anydbm_intvalue.py
Traceback (most recent call last):
  File "anydbm_intvalue.py", line 8, in 
    db['one'] = 1
  File "/usr/lib/python2.6/bsddb/__init__.py", line 276, in __setitem__
    _DeadlockWrap(wrapF)  # self.db[key] = value
  File "/usr/lib/python2.6/bsddb/dbutils.py", line 68, in DeadlockWrap
    return function(*_args, **_kwargs)
  File "/usr/lib/python2.6/bsddb/__init__.py", line 275, in wrapF
    self.db[key] = value
TypeError: Data values must be of type string or None.

Vedere anche:

anydbm
La documentazione della libreria standard per questo modulo.
shelve
Esempi per il modulo shelve, che usa anydbm per conservare i dati
Data Persistence
Persistenza e Scambio Dati