Un ``shelf'' (estante) es un objeto persistente que se comporta como un
diccionario. La diferencia con las bases de datos ``dbm'' es que los valores
(no las claves) pueden ser objetos Python arbitrarios, cualquier cosa que sea
capaz de manejar el módulo pickle. Esto incluye la mayoría de
las instancias de clase, los tipos de datos recursivos y los objetos que
contienen multitud de sub-objetos compartidos. Las claves son cadenas normales.
Para resumir la interfaz (clave
es una cadena, datos
es un objeto
arbitrario):
import shelve
d = shelve.open(nombrefichero) # abrir, con (g)dbm, nombrefichero -- sin sufijo
d[clave] = datos # guarda los datos en la clave (sobreescribiendo los datos antiguos
# si ya se había usado esa clave)
datos = d[clave] # recupera los datos de esa clave (lanza KeyError si no existe tal clave)
del d[clave] # elimina los datos de esa clave (lanza KeyError si no existe tal clave)
flag = d.has_key(clave) # Verdadero si la clave existe
lista = d.keys() # una lista de las claves existentes (es lento)
d.close() # cerrarlo
Restricciones:
- La elección de que paquete de base de datos se utilizará
(es decir, dbm o gdbm) depende de que interfaz
esté dsponible. Por ello, no es seguro abrir la base de datos directamente con
dbm. La base de datos también está sujeta (por desgracia)
a las limitaciones de dbm, si se usa éste. Esto significa que
la representación de los objetos almacenados en la base de datos
debe ser relativamente pequeña y que, en ocasiones, las colisiones de clave
pueden hacer que la base de datos rechace actualizaciones.
- Dependiendo de la implementación, cerrar un diccionario persistente puede,
o no, ser necesario para volcar los cambios al disco.
- El módulo shelve no soporta acceso concurrente de
lectura/escritura a los objetos almacenados (los accesos múltiples simultáneos
de lectura son seguros). Cuando un programa tiene un estante abierto para
escritura, ningún otro programa debería abrirlo para leer ni escribir.
Se puede utilizar el bloqueo de ficheros Unix para resolver esto, pero
cambia con las versiones de Unix y requiere conocimiento de la implementación
de la base de datos utilizada.
Más informació en:
- Module anydbm:
- Interfaz genérica a las bases de datos tipo
dbm
.
- Module dbhash:
- Interfaz con la base de datos
db
BSD.
- Module dbm:
- Interfaz con la base de datos Unix estándar.
- Module dumbdbm:
- Implementación portátil de la interfaz con la base de datos
dbm
.
- Module gdbm:
- Interfaz con la base de datos GNU, basada en la interfaz
dbm
.
- Module pickle:
- Serialización de objetos utilizada por shelve.
- Module cPickle:
- Versión de alto rendimiento de pickle.
Ver Sobre este documento... para obtener información sobre sugerencias.