Содержание страницы
11.5. dbm – интерфейсы к «базам данных» Unix¶dbm – Interfaces to Unix “databases”
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() теперь доступны во всех модулях баз данных.
Ключи и значения всегда хранятся в виде байтов. Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.
Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:
import dbm
# Открыть базу данных, создав её при необходимости.
db = dbm.open('cache', 'c')
# Записать несколько значений.
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.close()
См. также
- Модуль shelve
- Модуль персистентности, который хранит нестроковые данные.
Отдельные подмодули описаны в следующих разделах.
11.5.1. dbm.gnu – переосмысление dbm от GNU¶dbm.gnu – GNU’s reinterpretation of dbm
Платформы: Unix
Этот модуль очень похож на модуль 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()¶
Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.
11.5.2. dbm.ndbm – интерфейс на основе ndbm¶dbm.ndbm – Interface based on ndbm
Платформы: Unix
Модуль 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 и возвращает объект dbm. Аргумент filename – это имя файла базы данных (без расширений .dir или .pag).
Необязательный аргумент flag должен быть одним из следующих значений:
Значение Значение 'r' Открыть существующую базу данных только для чтения (по умолчанию) 'w' Открыть существующую базу данных для чтения и записи 'c' Открыть базу данных для чтения и записи, создав её, если она не существует 'n' Всегда создавать новую пустую базу данных, открытую для чтения и записи Необязательный аргумент mode – это режим Unix для файла, используется только при создании базы данных. По умолчанию равен восьмеричному 0o666 (и будет изменён в соответствии с текущей umask).
11.5.3. dbm.dumb – портативная реализация DBM¶dbm.dumb – Portable DBM implementation
Примечание
Модуль 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 в настоящее время игнорируется; база данных всегда открывается для обновления и будет создана, если она не существует.
Необязательный аргумент mode – это Unix-режим файла, используемый только при создании базы данных. По умолчанию он равен восьмеричному 0o666 (и будет изменён действующей маской umask).
В дополнение к методам, предоставляемым классом collections.MutableMapping, объекты dumbdbm предоставляют следующий метод:
- dumbdbm.sync()¶
Синхронизирует каталог и файлы данных на диске. Этот метод вызывается методом Shelve.sync().