dbm - Database Unix Chiave-Valore
Scopo: Fornisce una generica interfaccia tipo dizionario per database stile DBM, con chiavi stringa
Il modulo dbm è un front-end per database stile DBM che usano semplici valori stringa come chiavi per accedere a record che contengono stringhe. Usa whichdb() per identificare i database, che apre con il modulo appropriato. Viene usato come back-end per shelve, che conserva gli oggetti in un database DBM usando pickle.
Tipi di Database
Python è dotato di diversi moduli per accedere a database stile DBM. L'implementazione predefinita selezionata dipende dalle librerie attualmente a disposizione nel sistema corrente e dalle opzioni usate quanto Python è stato compilato. Interfacce separate per le specifiche implementazioni consentono ai programmi Python di scambiare dati con programmi scritti in altri linguaggi che non effettuano automaticamente la selezione tra i formati disponibili, oppure per scrivere file dati portabili che funzioneranno su piattaforme multiple.
dbm.gnu
dbm.gnu è una interfaccia alla versione della libreria dbm del progetto GNU. Funziona alle stesso modo delle altre implementazioni DBM descritte qui, con poche modifiche all'argomento flags supportato da open().
Altre ai flag standard 'r', 'w', 'c' ed 'n', dbu.gnu.open() supporta:
'f'per aprire il database in modalità veloce; le scritture al database non sono sincronizzate.'s'per aprire il database in modalità sincronizzata; le modifiche al database sono scritte al file non appena eseguite, invece che essere posposte fino alla chiusura del database o dopo una sincronizzazione esplicita.'u'per aprire il database in modalità non esclusiva.
dbm.ndbm
Il modulo dbm.ndbm fornisce una interfaccia alle implementazioni Unix ndbm del formato dbm, a seconda di come il modulo è stato configurato durante la compilazione. L'attributo di modulo library identifica il nome della libreria che configure è riuscito a trovare quanto il modulo di estensione è stato compilato.
dmb.dumb
Il modulo dbm.dumb è una implementazione fallback portabile dell'API DBM quando non sono disponibili altre implementazioni. Non sono richieste dipendenze esterne per usare dbm.dumb, ma è la più lenta delle implementazioni.
Creare un Nuovo Database
Il formato di conservazione per nuovi database è selezionato cercando versioni utilizzabili di ciascuno dei sotto moduli nell'ordine:
dbm.gnudbm.ndbmdbm.dumb
La funzione open() riceve l'argomento flags per controllare come gestire il database. Per creare un nuovo database quando necessario, si usi 'c'. Usando 'n' viene sempre creato un nuovo database, sovrascrivendo un eventuale esistente.
# dbm_new.py
import dbm
with dbm.open('/tmp/example.db', 'n') as db:
db['key'] = 'value'
db['today'] = 'Sunday'
db['author'] = 'Doug'
In questo esempio, il file viene sempre reinizializzato.
$ python3 dbm_new.py
whichdb() riporta il tipo di database creato.
# dbm_whichdb.py
import dbm
print(dbm.whichdb('/tmp/example.db'))
Il risultato del programma precedente potrebbe variare, a seconda di quali moduli siano installati nel sistema.
$ python3 dbm_whichdb.py dbm.gnu
Aprire un Database Esistente
Per aprire un database esistente, si usino i parametri 'r' (sola lettura) oppure 'w' (lettura e scrittura) per l'argomento flags. I database esistenti sono automaticamente passati a whichdb() per l'identificazione, quindi fintanto che un file può essere identificato, viene usato il modulo appropriato per aprirlo.
# dbm_existing.py
import dbm
with dbm.open('/tmp/example.db', 'r') as db:
print('keys():', db.keys())
for k in db.keys():
print('iterando:', k, db[k])
print('db["author"] =', db['author'])
Una volta aperto, db è un oggetto tipo dizionario. Le nuove chiavi sono sempre convertite in stringhe di byte quando aggiunte al database e ritornate con lo stesso formato.
$ python3 dbm_existing.py keys(): [b'today', b'author', b'key'] iterando: b'today' b'Sunday' iterando: b'author' b'Doug' iterando: b'key' b'value' db["author"] = b'Doug'
Casi di Errore
Le chiavi del database devono essere stringhe.
# dbm_intkeys.py
import dbm
with dbm.open('/tmp/example.db', 'w') as db:
try:
db[1] = 'one'
except TypeError as err:
print(err)
Passare un tipo diverso provoca un errore TypeError.
$ python3 dbm_intkeys.py gdbm mappings have bytes or string indices only
I valori devono essere stringa oppure None.
# dbm_intvalue.py
import dbm
with dbm.open('/tmp/example.db', 'w') as db:
try:
db['one'] = 1
except TypeError as err:
print(err)
Lo stesso errore viene sollevato quando un valore non è stringa.
$ python3 dbm_intvalue.py gdbm mappings have bytes or string indices only
Vedere anche:
- dbm
- La documentazione della libreria standard per questo modulo.
- Note di portabilità per anydbm
- Note di portabilità per whichdb
- shelve
- Esempi per il modulo
shelve, che usa dbm per conservare i dati.