Scopo | anydbm fornisce una interfaccia generica tipo dizionario ai database in stile DBM con chiavi a stringa |
Versione Python | 1.4 e superiore |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per le versioni 3.x di Python
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 .
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
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
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, indb[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, indb['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: