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.
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ó.
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.
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.
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
.
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
Ver también
- Documentación de la biblioteca estándar para dbm
- Notas para portar Python 2 a 3 para anydbm
- Notas para portar Python 2 a 3 para whichdb
shelve
– Ejemplos para el móduloshelve
, que usadbm
para almacenar datos.