Автор оригинала: Doug Hellmann.
Цель:
dbm предоставляет общий словарь-подобный интерфейс для баз данных со строковыми ключами в стиле DBM.
dbm
– это интерфейс для баз данных в стиле DBM, которые используют простые строковые значения в качестве ключей для доступа к записям, содержащим строки. Он использует whichdb ()
для идентификации баз данных, а затем открывает их с помощью соответствующего модуля. Он используется как серверная часть для полки, которая хранит объекты в базе данных DBM с помощью pickle.
Типы баз данных
Python поставляется с несколькими модулями для доступа к базам данных в стиле DBM. Выбранная реализация по умолчанию зависит от библиотек, доступных в текущей системе, и параметров, используемых при компиляции Python. Отдельные интерфейсы для конкретных реализаций позволяют программам Python обмениваться данными с программами на других языках, которые не переключаются автоматически между доступными форматами, или записывать переносимые файлы данных, которые будут работать на нескольких платформах.
dbm.gnu
dbm.gnu
– это интерфейс к версии библиотеки dbm
из проекта GNU. Он работает так же, как и другие реализации DBM, описанные здесь, с некоторыми изменениями в flags
, поддерживаемых open ()
.
Помимо стандартных флагов 'r'
, 'w'
, 'c'
и 'n'
, < code> dbm.gnu.open () поддерживает:
'f'
, чтобы открыть базу данных в быстром режиме. В быстром режиме записи в базу данных не синхронизируются.'s'
, чтобы открыть базу данных в синхронизированном режиме. Изменения в базе данных записываются в файл по мере их внесения, а не откладываются до закрытия или явной синхронизации базы данных.'u'
, чтобы открыть базу данных без блокировки.
dbm.ndbm
Модуль dbm.ndbm
предоставляет интерфейс для Unix ndbm-реализаций формата dbm в зависимости от того, как модуль был настроен во время компиляции. Атрибут модуля library
определяет имя библиотеки, которую configure
смог найти при компиляции модуля расширения.
dbm.dumb
Модуль dbm.dumb
– это переносимая резервная реализация DBM API, когда другие реализации недоступны. Для использования dbm.dumb
не требуются внешние зависимости, но он работает медленнее, чем большинство других реализаций.
Создание новой базы данных
Формат хранения для новых баз данных выбирается путем поиска пригодных для использования версий каждого из подмодулей по порядку.
dbm.gnu
dbm.ndbm
dbm.dumb
Функция open ()
принимает flags
для управления тем, как управляется файл базы данных. Чтобы при необходимости создать новую базу данных, используйте 'c'
. Использование 'n'
всегда создает новую базу данных, перезаписывая существующий файл.
dbm_new.py
import dbm with dbm.open('/tmp/example.db', 'n') as db: db['key'] 'value' db['today'] 'Sunday' db['author'] 'Doug'
В этом примере файл всегда повторно инициализируется.
$ python3 dbm_new.py
whichdb ()
сообщает о типе созданной базы данных.
dbm_whichdb.py
import dbm print(dbm.whichdb('/tmp/example.db'))
Вывод из примера программы будет отличаться в зависимости от того, какие модули установлены в системе.
$ python3 dbm_whichdb.py dbm.ndbm
Открытие существующей базы данных
Чтобы открыть существующую базу данных, используйте flags
либо 'r'
(только для чтения), либо 'w'
(для чтения-записи) . Существующие базы данных автоматически передаются в whichdb ()
для идентификации, поэтому, пока файл может быть идентифицирован, соответствующий модуль используется для его открытия.
dbm_existing.py
import dbm with dbm.open('/tmp/example.db', 'r') as db: print('keys():', db.keys()) for k in db.keys(): print('iterating:', k, db[k]) print('db["author"] =', db['author'])
После открытия db
представляет собой объект, подобный словарю. Новые ключи всегда преобразуются в байтовые строки при добавлении в базу данных и возвращаются как байтовые строки.
$ python3 dbm_existing.py keys(): [b'key', b'today', b'author'] iterating: b'key' b'value' iterating: b'today' b'Sunday' iterating: b'author' b'Doug' db["author"] = b'Doug'
Случаи ошибок
Ключи базы данных должны быть строками.
dbm_intkeys.py
import dbm with dbm.open('/tmp/example.db', 'w') as db: try: db[1] 'one' except TypeError as err: print(err)
Передача другого типа приводит к ошибке TypeError
.
$ python3 dbm_intkeys.py dbm mappings have bytes or string keys only
Значения должны быть строками или None
.
dbm_intvalue.py
import dbm with dbm.open('/tmp/example.db', 'w') as db: try: db['one'] 1 except TypeError as err: print(err)
Аналогичная ошибка TypeError
возникает, если значение не является строкой.
$ python3 dbm_intvalue.py dbm mappings have byte or string elements only
Смотрите также
- стандартная библиотечная документация для dbm
- Замечания по переносу Python 2 на 3 для anydbm
- Заметки о переносе Python 2 на 3 для whichdb
- shelve – примеры модуля
shelve
, который используетdbm
для