PyMOTW: anydbm (y módulos relacionados)
21 Septiembre 2008
Traducción de PyMOTW: anydbm el módulo anydbm y módulos relacionados de la columna semana de Doug Hellman
| Módulo: | anydbm |
|---|---|
| Propósito: | El módulo anydbm proporciona una interfaz genérica similar a diccionarios para base de datos del estilo DBM con cadenas como llaves. |
| Versión de Python: | 1.4 y posterior |
anydbm es un front-end para bases de datos del estilo DBM que usan cadenas
(de texto) simples como llaves para acceder a registros que contienen cadenas.
Utiliza el módulo whichdb para identificar bases de datos dbhash, gdbm y
dbm, luego las abre con el módulo apropiado. Es usado como backend para
shelve, que sabe como guardar objetos usando pickle.
Creando una nueva base de datos
El formato de almacenamiento para nuevas bases de datos es seleccionado buscando cada uno de estos módulo en orden:
-
dbhash -
gdbm -
dbm -
dumbdbm
La función open() acepta flags para controlar como es gestionado el
archivo de base de datos. Para crea una base de datos nuevo cuando sea
necesario, usa 'c'. Para crear una nueva base de datos siempre, usa 'n'.
import anydbm
db = anydbm.open('/tmp/ejemplo.db', 'n')
db['llave'] = 'valor'
db['hoy'] = 'Domingo'
db['autor'] = 'Ernesto'
db.close()
En este ejemplo, el archivo siempre es re inicializado. Para ver qué tipo de
base de datos ha sido creada, podemos usar whichdb.
import whichdb
print whichdb.whichdb('/tmp/ejemplo.db')
Los resultado pueden variar dependiendo qué módulos están instalados en tu sistema.
$ python anydbm_whichdb.py
dbhash
Abriendo una base de datos existente
Para abrir una base de datos existente, usa flags 'r' (para sólo lectura) o
'w' (para lectura y escritura). No necesitas preocuparte por el formato,
porque bases de datos existentes son automáticamente se dan whichdb para su
identificación. Si un file puede ser identificado, el módulos apropiado es
utilizado para abrirlo.
import anydbm
db = anydbm.open('/tmp/ejemplo.db', 'r')
try:
print 'keys():', db.keys()
for k, v in db.iteritems():
print 'iterando:', k, v
print 'db["autor"] =', db['autor']
finally:
db.close()
Una vez abierto, db es un objeto similar a un diccionario, con soporte para
los métodos habituales.
$ python anydbm_existing.py
keys(): ['llave', 'hoy', 'autor']
iterando: llave valor
iterando: hoy Domingo
iterando: autor Ernesto
db["autor"] = Ernesto
Casos de error
Las llaves de la base de datos tienen que ser cadenas.
import anydbm
db = anydbm.open('/tmp/ejemplo.db', 'w')
try:
db[1] = 'uno'
finally:
db.close()
Pasar otro tipo (de objeto) resulta en un TypeError.
$ python anydbm_intkeys.py
Traceback (most recent call last):
File "anydbm_intkeys.py", line 16, in <module>
db[1] = 'uno'
File "/home/ers/Projects/PyMOTW-es/anydbm/__init__.py", line 230, in __setitem__
File "bsddb/dbutils.py", line 62, in DeadlockWrap
File "/home/ers/Projects/PyMOTW-es/anydbm/__init__.py", line 229, in wrapF
TypeError: Integer keys only allowed for Recno and Queue DB's
Los valores tienen que ser cadenas o None.
import anydbm
db = anydbm.open('/tmp/ejemplo.db', 'w')
try:
db['uno'] = 1
finally:
db.close()
Un TypeError similar es lanzado si el valor no es una cadena.
$ python anydbm_intvalue.py
Traceback (most recent call last):
File "anydbm_intvalue.py", line 16, in <module>
db['uno'] = 1
File "/home/ers/Projects/PyMOTW-es/anydbm/__init__.py", line 230, in __setitem__
File "bsddb/dbutils.py", line 62, in DeadlockWrap
File "/home/ers/Projects/PyMOTW-es/anydbm/__init__.py", line 229, in wrapF
TypeError: Data values must be of type string or None.
Referencias
PyMOTW Home
Descarga los ejemplos
Documentación biblioteca estándar: anydbm
Copyright 2008 Doug Hellmann.
blog comments powered by Disqus
