#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'