Рубрики
Без рубрики

dbm – Базы данных ключей и значений Unix

Автор оригинала: 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

Смотрите также