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.