dbm — Bases de datos clave-valor de Unix

Propósito:dbm proporciona una interfaz genérica similar a un diccionario para bases de datos estilo DBM con de cadenas de caracteres como llave

dbm es un front-end para bases de datos de estilo DBM que usan simples valores de cadena como claves para acceder a registros que contienen cadenas. Usa whichdb() para identificar bases de datos, luego las abre con el módulo apropiado. Se utiliza como back-end para shelve, que almacena objetos en una base de datos DBM usando pickle.

Tipos de base de datos

Python viene con varios módulos para acceder a bases de datos de estilo DBM. La implementación predeterminada seleccionada depende de las bibliotecas disponibles en el sistema actual y las opciones utilizadas cuando Python era compilado. Interfaces separadas a las implementaciones específicas permiten que programas de Python intercambien datos con programas en otros idiomas que no cambien automáticamente entre los formatos disponibles, o para escribir archivos de datos portables que funcionarán en múltiples plataformas.

dbm.gnu

dbm.gnu es una interfaz para la versión dbm de la biblioteca del proyecto GNU. Funciona igual que las otras implementaciones DBM descritas aquí, con algunos cambios en las banderas soportadas por open().

Además de las banderas estándar 'r', 'w', 'c' y 'n', dbm.gnu.open() soporta:

  • 'f' para abrir la base de datos en modo rápido. En el modo rápido, Las escrituras en la base de datos no están sincronizadas.
  • 's' para abrir la base de datos en modo sincronizado. Cambios a la base de datos se escriben en el archivo a medida que se hacen, en lugar de que ser retrasos hasta que la base de datos se cierra o sincroniza explícitamente.
  • 'u' para abrir la base de datos desbloqueada.

dbm.ndbm

El módulo dbm.ndbm proporciona una interfaz para la implementación Unix ndbm del formato dbm, dependiendo de cómo fue configurado el módulo durante la compilación. El atributo del módulo library identifica el nombre de la biblioteca configure pudo encontrar cuando el módulo de extensión fue compilado.

dbm.dumb

El módulo dbm.dumb es una implementación de respaldo portátil de la interfaz de programación de DBM cuando no hay otras implementaciones disponibles. No se requieren dependencias externas para usar dbm.dumb, pero es más lento que la mayoría de las otras implementaciones.

Crear una nueva base de datos

El formato de almacenamiento para las nuevas bases de datos se selecciona buscando versiones utilizables de cada uno de los submódulos en orden.

  • dbm.gnu
  • dbm.ndbm
  • dbm.dumb

La función open() toma flags para controlar cómo el archivo de la base de datos es gestionado. Para crear una nueva base de datos cuando sea necesario, usa 'c'. Usar 'n' siempre crea una nueva base de datos, sobrescribiendo una archivo existente.

dbm_new.py
import dbm

with dbm.open('/tmp/example.db', 'n') as db:
    db['key'] = 'value'
    db['today'] = 'Sunday'
    db['author'] = 'Doug'

En este ejemplo, el archivo siempre se reinicializa.

$ python3 dbm_new.py

whichdb() informa el tipo de base de datos que se creó.

dbm_whichdb.py
import dbm

print(dbm.whichdb('/tmp/example.db'))

La salida del programa de ejemplo variará, dependiendo de qué módulos están instalados en el sistema.

$ python3 dbm_whichdb.py

dbm.ndbm

Abrir una base de datos existente

Para abrir una base de datos existente, use flags de 'r' (para solo lectura) o 'w' (para lectura-escritura). Las bases de datos existentes son asignadas automáticamente a whichdb() para identificar, de modo que siempre y cuando se puede identificar el archivo, se usa el módulo apropiado para abrirlo.

dbm_existing.py
import dbm

with dbm.open('/tmp/example.db', 'r') as db:
    print('keys():', db.keys())
    for k in db.keys():
        print('iterating:', k, db[k])
    print('db["author"] =', db['author'])

Una vez abierto, db es un objeto similar a un diccionario. Las nuevas claves son siempre convertidas a cadenas de bytes cuando se agregan a la base de datos y se devuelve como cadenas de bytes.

$ python3 dbm_existing.py

keys(): [b'key', b'today', b'author']
iterating: b'key' b'value'
iterating: b'today' b'Sunday'
iterating: b'author' b'Doug'
db["author"] = b'Doug'

Casos de error

Las claves de la base de datos deben ser cadenas.

dbm_intkeys.py
import dbm

with dbm.open('/tmp/example.db', 'w') as db:
    try:
        db[1] = 'one'
    except TypeError as err:
        print(err)

Pasar otro tipo da como resultado un TypeError.

$ python3 dbm_intkeys.py

dbm mappings have bytes or string keys only

Los valores deben ser cadenas o 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)

Un TypeError similar se genera si un valor no es una cadena.

$ python3 dbm_intvalue.py

dbm mappings have byte or string elements only