Документация Python неофициальный перевод
Содержание страницы

12.5. dbm – Интерфейсы к Unix-«базам данных»dbm – Interfaces to Unix “databases”

Исходный код: Lib/dbm/__init__.py


dbm – это универсальный интерфейс к разновидностям базы данных DBM: dbm.gnu или dbm.ndbm. Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация из модуля dbm.dumb. Существует также сторонний интерфейс к Oracle Berkeley DB.

exception dbm.error

Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с именем dbm.error является первым элементом – последнее используется, когда возбуждается dbm.error.

dbm.whichdb(filename)

Эта функция пытается угадать, какой из нескольких доступных простых модулей баз данных – dbm.gnu, dbm.ndbm или dbm.dumb – следует использовать для открытия указанного файла.

Возвращает одно из следующих значений: None, если файл невозможно открыть, так как он нечитаем или не существует; пустую строку (''), если формат файла не удаётся определить; или строку, содержащую имя требуемого модуля, например 'dbm.ndbm' или 'dbm.gnu'.

dbm.open(file, flag='r', mode=0o666)

Открывает файл базы данных file и возвращает соответствующий объект.

Если файл базы данных уже существует, функция whichdb() используется для определения его типа и используется соответствующий модуль; если он не существует, используется первый модуль из перечисленных выше, который можно импортировать.

Необязательный аргумент flag может быть:

Значение

Значение

'r'

Открыть существующую базу данных только для чтения (по умолчанию)

'w'

Открыть существующую базу данных для чтения и записи

'c'

Открыть базу данных для чтения и записи, создав её, если она не существует

'n'

Всегда создавать новую пустую базу данных, открытую для чтения и записи

Необязательный аргумент mode – это режим файла Unix, используемый только при создании базы данных. По умолчанию это восьмеричное 0o666 (и будет изменено текущей umask).

Объект, возвращаемый open(), поддерживает ту же базовую функциональность, что и словари; ключи и соответствующие им значения могут быть сохранены, получены и удалены, а также доступны оператор in и метод keys(), а также get() и setdefault().

Изменено в версии 3.2: get() и setdefault() теперь доступны во всех модулях баз данных.

Ключи и значения всегда хранятся в виде байтов. Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.

Эти объекты также поддерживают использование в операторе with, который автоматически закроет их по завершении.

Изменено в версии 3.4: Добавлена встроенная поддержка протокола управления контекстом для объектов, возвращаемых open().

Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:

import dbm

# Открыть базу данных, создав её при необходимости.
with dbm.open('cache', 'c') as db:

    # Записать несколько значений.
    db[b'hello'] = b'there'
    db['www.python.org'] = 'Python Website'
    db['www.cnn.com'] = 'Cable News Network'

    # Обратите внимание: теперь ключи считаются байтами.
    assert db[b'www.python.org'] == b'Python Website'
    # Обратите внимание, что теперь значение хранится в байтах.
    assert db['www.cnn.com'] == b'Cable News Network'

    # Часто используемые методы интерфейса dict также работают.
    print(db.get('python.org', b'not present'))

    # Сохранение нестрокового ключа или значения вызовет исключение (скорее всего,
    # TypeError).
    db['www.yahoo.com'] = 4

# db автоматически закрывается при выходе из оператора with.

См. также

Модуль shelve

Модуль персистентности, который хранит нестроковые данные.

Отдельные подмодули описаны в следующих разделах.

12.5.1. dbm.gnu – GNU-реализация dbmdbm.gnu – GNU’s reinterpretation of dbm

Исходный код: Lib/dbm/gnu.py


Этот модуль очень похож на модуль dbm, но использует библиотеку GNU gdbm для предоставления некоторых дополнительных возможностей. Обратите внимание, что форматы файлов, созданные dbm.gnu и dbm.ndbm, несовместимы.

Модуль dbm.gnu предоставляет интерфейс к библиотеке GNU DBM. Объекты dbm.gnu.gdbm ведут себя как отображения (словари), за исключением того, что ключи и значения всегда преобразуются в байты перед сохранением. При печати объекта gdbm ключи и значения не выводятся, а методы items() и values() не поддерживаются.

exception dbm.gnu.error

Возбуждается при ошибках, специфичных для dbm.gnu, таких как ошибки ввода-вывода. KeyError возбуждается для общих ошибок отображения, например, при указании неверного ключа.

dbm.gnu.open(filename[, flag[, mode]])

Открывает базу данных gdbm и возвращает объект gdbm. Аргумент filename – это имя файла базы данных.

Необязательный аргумент flag может быть:

Значение

Значение

'r'

Открыть существующую базу данных только для чтения (по умолчанию)

'w'

Открыть существующую базу данных для чтения и записи

'c'

Открыть базу данных для чтения и записи, создав её, если она не существует

'n'

Всегда создавать новую пустую базу данных, открытую для чтения и записи

Следующие дополнительные символы могут быть добавлены к флагу для управления тем, как открывается база данных:

Значение

Значение

'f'

Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться.

's'

Синхронизированный режим. Это приведёт к тому, что изменения в базу данных будут немедленно записаны в файл.

'u'

Не блокировать базу данных.

Не все флаги допустимы для всех версий gdbm. Константа модуля open_flags – это строка поддерживаемых символов флагов. Исключение error возникает, если указан недопустимый флаг.

Необязательный аргумент mode – это Unix-режим файла, используемый только при создании базы данных. По умолчанию он равен восьмеричному 0o666.

В дополнение к методам, похожим на словарные, объекты gdbm имеют следующие методы:

gdbm.firstkey()

Можно перебрать все ключи в базе данных с помощью этого метода и метода nextkey(). Порядок обхода определяется внутренними хеш-значениями gdbm, а не сортировкой по ключам. Этот метод возвращает начальный ключ.

gdbm.nextkey(key)

Возвращает ключ, следующий за key при обходе. Следующий код выводит все ключи базы данных db, не создавая в памяти список, содержащий их все:

k = db.firstkey()
while k != None:
    print(k)
    k = db.nextkey(k)
gdbm.reorganize()

Если было выполнено много удалений и требуется уменьшить пространство, занимаемое файлом gdbm, эта процедура проведёт реорганизацию базы данных. Объекты gdbm не сокращают длину файла базы данных, кроме как с помощью этой реорганизации; в противном случае освободившееся пространство сохраняется и повторно используется при добавлении новых пар (ключ, значение).

gdbm.sync()

Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.

gdbm.close()

Закрыть базу данных gdbm.

12.5.2. dbm.ndbm – Интерфейс на основе ndbmdbm.ndbm – Interface based on ndbm

Исходный код: Lib/dbm/ndbm.py


Модуль dbm.ndbm предоставляет интерфейс к библиотеке Unix «(n)dbm». Объекты dbm ведут себя как отображения (словари), за исключением того, что ключи и значения всегда хранятся в виде байтов. Вывод объекта dbm не отображает ключи и значения, а методы items() и values() не поддерживаются.

Этот модуль можно использовать с «классическим» интерфейсом ndbm или с интерфейсом совместимости GNU GDBM. В Unix скрипт configure попытается найти соответствующий заголовочный файл, чтобы упростить сборку этого модуля.

exception dbm.ndbm.error

Возникает при ошибках, специфичных для dbm.ndbm, например, при ошибках ввода-вывода. KeyError возникает при общих ошибках отображения, например, при указании неверного ключа.

dbm.ndbm.library

Имя используемой библиотеки реализации ndbm.

dbm.ndbm.open(filename[, flag[, mode]])

Открывает базу данных dbm и возвращает объект ndbm. Аргумент filename – это имя файла базы данных (без расширений .dir или .pag).

Необязательный аргумент flag должен быть одним из следующих значений:

Значение

Значение

'r'

Открыть существующую базу данных только для чтения (по умолчанию)

'w'

Открыть существующую базу данных для чтения и записи

'c'

Открыть базу данных для чтения и записи, создав её, если она не существует

'n'

Всегда создавать новую пустую базу данных, открытую для чтения и записи

Необязательный аргумент mode – это режим файла Unix, используемый только при создании базы данных. По умолчанию это восьмеричное 0o666 (и будет изменено текущей umask).

В дополнение к методам, похожим на словарные, объекты ndbm предоставляют следующий метод:

ndbm.close()

Закрыть базу данных ndbm.

12.5.3. dbm.dumb – Переносимая реализация DBMdbm.dumb – Portable DBM implementation

Исходный код: Lib/dbm/dumb.py

Примечание

Модуль dbm.dumb предназначен в качестве запасного варианта для модуля dbm, когда более надёжный модуль недоступен. Модуль dbm.dumb не оптимизирован для скорости и используется не так интенсивно, как другие модули баз данных.


Модуль dbm.dumb предоставляет постоянный интерфейс, похожий на словарь, который полностью написан на Python. В отличие от других модулей, таких как dbm.gnu, не требуется внешняя библиотека. Как и в других постоянных отображениях, ключи и значения всегда хранятся в виде байтов.

Модуль определяет следующее:

exception dbm.dumb.error

Возникает при ошибках, специфичных для dbm.dumb, например, при ошибках ввода-вывода. KeyError возникает при общих ошибках отображения, например, при указании неверного ключа.

dbm.dumb.open(filename[, flag[, mode]])

Открывает базу данных dumbdbm и возвращает объект dumbdbm. Аргумент filename – это базовое имя файла базы данных (без каких-либо конкретных расширений). При создании базы данных dumbdbm создаются файлы с расширениями .dat и .dir.

Необязательный аргумент flag поддерживает только семантику значений 'c' и 'n'. Другие значения по умолчанию открывают базу данных для обновления, и она будет создана, если не существует.

Необязательный аргумент mode – это режим файла Unix, используемый только при создании базы данных. По умолчанию это восьмеричное 0o666 (и будет изменено текущей umask).

Изменено в версии 3.5: open() всегда создаёт новую базу данных, если флаг имеет значение 'n'.

Устарело с версии 3.6, будет удалено в версии 3.8: Создание базы данных в режимах 'r' и 'w'. Изменение базы данных в режиме 'r'.

В дополнение к методам, предоставляемым классом collections.abc.MutableMapping, объекты dumbdbm предоставляют следующие методы:

dumbdbm.sync()

Синхронизировать каталог на диске и файлы данных. Этот метод вызывается методом Shelve.sync().

dumbdbm.close()

Закрыть базу данных dumbdbm.