Использование модуля dbm в Python 3

#python #database #python-3.x #dbm

#python #База данных #python-3.x #dbm

Вопрос:

Я изучаю файлы базы данных и модуль dbm в Python 3.1.3, и у меня возникают проблемы с использованием некоторых методов из модуля anydbm в Python 2.

Метод keys работает нормально,

 import dbm

db = dbm.open('dbm', 'c')
db['modest'] = 'mouse'
db['dream'] = 'theater'

for key in db.keys():
    print(key)
  

выдает:

 b'modest'
b'dream'
  

но элементы и значения,

 for k,v in db.items():
    print(k, v)

for val in db.values():
    print(val)
  

вызовите ошибку атрибута: объект ‘_dbm.dbm’ не имеет атрибута ‘items’.

Кроме того, это:

 for key in db:
    print(key)
  

возвращает ошибку типа: объект ‘_dbm.dbm’ не может быть повторен.

Эти методы просто не работают в модуле dbm в Python 3? Если это правда, есть ли что-нибудь еще, что я мог бы использовать вместо этого?

Ответ №1:

Я думаю, это зависит от того, какую реализацию он выбирает для использования. В моей системе dbm в Python 3 выбирает использование ndbm, что эквивалентно dbm модулю в Python 2. Когда я использую этот модуль явно, я вижу те же ограничения.

Похоже, что любая СУБД в Python 2 выбирает dumbdbm, которая медленнее, но поддерживает полный интерфейс словаря.

Возможно, вы захотите взглянуть на shelve модуль как в Python 2, так и в Python 3, который добавляет еще один слой поверх этих интерфейсов (позволяя вам хранить любой выделяемый объект).

Комментарии:

1. Shelve отлично работал для итерации по базе данных, но с использованием приведенных методов items и values- UnpicklingError: устранение переполнения стека. Есть ли какой-либо способ получить доступ к dumbdbm с помощью Python 3?

Ответ №2:

Цель такого рода простых баз данных — действовать как хранилища ключей / значений. Если вам нужны все значения, вам придется перебирать все ключи. Ie:

 values = [db[key] for key in db.keys()]
  

Это будет не быстро. Возможно, мне кажется, что такого рода хранилище ключей / значений на самом деле не то, что вам нужно. Возможно, SQLite был бы лучше?

Тем не менее, вы можете получить доступ к dumbdbm под именем dbm.dumb в Python 3.

 >>> import dbm
>>> db = dbm.dumb.open('dbm', 'c')
>>> 
>>> db['modest'] = 'mouse'
>>> db['dream'] = 'theater'
>>> for key in db.keys():
...     print(key)
... 
b'modest'
b'dream'
>>> for k,v in db.items():
...     print(k, v)
... 
b'modest' b'mouse'
b'dream' b'theater'
>>> for val in db.values():
...     print(val)
... 
b'mouse'
b'theater'