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.gnu
dbm.ndbm
dbm.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.