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


Comentarios

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:

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

Categorías