Содержание страницы
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 – Переосмысление dbm от GNU¶dbm.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 – Интерфейс на основе ndbm¶dbm.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 – Переносимая реализация DBM¶dbm.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'.В дополнение к методам, предоставляемым классом
collections.abc.MutableMapping, объектыdumbdbmпредоставляют следующие методы:-
dumbdbm.sync()¶ Синхронизировать каталог на диске и файлы данных. Этот метод вызывается методом
Shelve.sync().
-
dumbdbm.close()¶ Закрыть базу данных
dumbdbm.
-