> **Источник:** https://python-all.ru/3.12/library/dbm.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `dbm` – Интерфейсы к Unix-«базам данных»

**Исходный код:** [Lib/dbm/\_\_init\_\_.py](https://python-all.ru/src/3.12/Lib/dbm/__init__.py)

---

[`dbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm) – это универсальный интерфейс к разновидностям базы данных DBM: [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu) или [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm). Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация из модуля [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb). Существует также [сторонний интерфейс](https://python-all.ru/3.12/library/dbm.html) к Oracle Berkeley DB.

#### `exception dbm.error`

Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с именем [`dbm.error`](https://python-all.ru/3.12/library/dbm.html#dbm.error) является первым элементом – последнее используется, когда возбуждается [`dbm.error`](https://python-all.ru/3.12/library/dbm.html#dbm.error).

#### `dbm.whichdb(filename)`

Эта функция пытается угадать, какой из нескольких доступных простых модулей баз данных – [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu), [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm) или [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb) – следует использовать для открытия указанного файла.

Возвращает одно из следующих значений:

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

Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.12/glossary.html#term-path-like-object).

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

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

**Параметры:**

- **file** ([объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object)) –

  Файл базы данных для открытия.

  Если файл базы данных уже существует, для определения его типа используется функция [`whichdb()`](https://python-all.ru/3.12/library/dbm.html#dbm.whichdb), и применяется соответствующий модуль; если файл не существует, используется первый подмодуль из перечисленных выше, который можно импортировать.
- **flag** ([*str*](https://python-all.ru/3.12/library/stdtypes.html#str)) –

  - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.
  - `'w'`: Открыть существующую базу данных для чтения и записи.
  - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.
  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.
- **mode** ([*int*](https://python-all.ru/3.12/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.

Изменено в версии 3.11: *file* теперь принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object).

Объект, возвращаемый [`open()`](https://python-all.ru/3.12/library/dbm.html#dbm.open), поддерживает ту же базовую функциональность, что и [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict); ключи и соответствующие им значения могут быть сохранены, получены и удалены, а оператор [`in`](https://python-all.ru/3.12/reference/expressions.html#in) и метод `keys()` доступны, как и методы `get()` и `setdefault()`.

Ключи и значения всегда хранятся как [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes). Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.

Эти объекты также поддерживают использование в операторе [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with), который автоматически закроет их по завершении.

Изменено в версии 3.2: `get()` и `setdefault()` методы теперь доступны для всех бэкендов [`dbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm).

Изменено в версии 3.4: Добавлена встроенная поддержка протокола управления контекстом для объектов, возвращаемых [`open()`](https://python-all.ru/3.12/library/dbm.html#dbm.open).

Изменено в версии 3.8: Удаление ключа из базы данных только для чтения теперь возбуждает исключение, специфичное для модуля базы данных, вместо [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError).

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

```python
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`](https://python-all.ru/3.12/library/shelve.html#module-shelve)**
>
> Модуль персистентности, который хранит нестроковые данные.

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

## [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu) – менеджер баз данных GNU

**Исходный код:** [Lib/dbm/gnu.py](https://python-all.ru/src/3.12/Lib/dbm/gnu.py)

---

Модуль [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu) предоставляет интерфейс к библиотеке GDBM, аналогичный модулю [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm), но с дополнительными возможностями, такими как устойчивость к сбоям.

> **Примечание**
>
> Форматы файлов, созданные с помощью [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu) и [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm), несовместимы и не могут использоваться взаимозаменяемо.

#### `exception dbm.gnu.error`

Возбуждается при ошибках, специфичных для [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu), таких как ошибки ввода-вывода. [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError) возбуждается для общих ошибок отображения, например, при указании неверного ключа.

#### `dbm.gnu.open(filename, flag='r', mode=0o666, /)`

Открывает базу данных GDBM и возвращает объект `gdbm`.

**Параметры:**

- **filename** ([объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object)) – Файл базы данных для открытия.
- **flag** ([*str*](https://python-all.ru/3.12/library/stdtypes.html#str)) –

  - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.
  - `'w'`: Открыть существующую базу данных для чтения и записи.
  - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.
  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.

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

  - `'f'`: Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться.
  - `'s'`: Синхронизированный режим. Изменения в базе данных будут немедленно записаны в файл.
  - `'u'`: Не блокировать базу данных.

  Не все флаги допустимы для всех версий GDBM. Список поддерживаемых символов флагов см. в члене [`open_flags`](https://python-all.ru/3.12/library/dbm.html#dbm.gnu.open_flags).
- **mode** ([*int*](https://python-all.ru/3.12/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.

**Возбуждает:**

[**error**](https://python-all.ru/3.12/library/dbm.html#dbm.gnu.error) – Если передан недопустимый аргумент *flag*.

Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.12/glossary.html#term-path-like-object).

#### `dbm.gnu.open_flags`

Строка символов, которую поддерживает параметр *flag* функции [`open()`](https://python-all.ru/3.12/library/dbm.html#dbm.gnu.open).

Объекты `gdbm` ведут себя подобно [отображениям](https://python-all.ru/3.12/glossary.html#term-mapping), но методы `items()` и `values()` не поддерживаются. Также предоставлены следующие методы:

#### `gdbm.firstkey()`

С помощью этого метода и метода [`nextkey()`](https://python-all.ru/3.12/library/dbm.html#dbm.gnu.gdbm.nextkey) можно выполнять цикл по всем ключам базы данных. Обход упорядочен по внутренним хеш-значениям GDBM, а не по значениям ключей. Этот метод возвращает начальный ключ.

#### `gdbm.nextkey(key)`

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

```python
k = db.firstkey()
while k is not None:
    print(k)
    k = db.nextkey(k)
```

#### `gdbm.reorganize()`

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

#### `gdbm.sync()`

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

#### `gdbm.close()`

Закрывает базу данных GDBM.

## [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm) – Новый менеджер баз данных

**Исходный код:** [Lib/dbm/ndbm.py](https://python-all.ru/src/3.12/Lib/dbm/ndbm.py)

---

Модуль [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm) предоставляет интерфейс к библиотеке NDBM. Этот модуль можно использовать как с «классическим» интерфейсом NDBM, так и с интерфейсом совместимости GDBM.

> **Примечание**
>
> Форматы файлов, созданные с помощью [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu) и [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm), несовместимы и не могут использоваться взаимозаменяемо.

> **Предупреждение**
>
> Библиотека NDBM, поставляемая в составе macOS, имеет недокументированное ограничение на размер значений, что может привести к повреждению файлов базы данных при сохранении значений, превышающих этот лимит. Чтение таких повреждённых файлов может привести к жёсткому сбою (ошибке сегментации).

#### `exception dbm.ndbm.error`

Возникает при ошибках, специфичных для [`dbm.ndbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm.ndbm), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.

#### `dbm.ndbm.library`

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

#### `dbm.ndbm.open(filename, flag='r', mode=0o666, /)`

Открывает базу данных NDBM и возвращает объект `ndbm`.

**Параметры:**

- **имя\_файла** ([объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object)) – базовое имя файла базы данных (без расширений `.dir` или `.pag`).
- **flag** ([*str*](https://python-all.ru/3.12/library/stdtypes.html#str)) –

  - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.
  - `'w'`: Открыть существующую базу данных для чтения и записи.
  - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.
  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.
- **mode** ([*int*](https://python-all.ru/3.12/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.

Объекты `ndbm` ведут себя подобно [отображениям](https://python-all.ru/3.12/glossary.html#term-mapping), но методы `items()` и `values()` не поддерживаются. Также предоставлены следующие методы:

Изменено в версии 3.11: Принимает [объект, подобный пути](https://python-all.ru/3.12/glossary.html#term-path-like-object) для имени файла.

#### `ndbm.close()`

Закрывает базу данных NDBM.

## [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb) – переносимая реализация DBM

**Исходный код:** [Lib/dbm/dumb.py](https://python-all.ru/src/3.12/Lib/dbm/dumb.py)

> **Примечание**
>
> Модуль [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb) предназначен в качестве запасного варианта для модуля [`dbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm), когда более надёжный модуль недоступен. Модуль [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb) не оптимизирован для скорости и используется не так интенсивно, как другие модули баз данных.

---

Модуль [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb) предоставляет постоянный (persistent) интерфейс, подобный [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict), полностью написанный на Python. В отличие от других бэкендов [`dbm`](https://python-all.ru/3.12/library/dbm.html#module-dbm), таких как [`dbm.gnu`](https://python-all.ru/3.12/library/dbm.html#module-dbm.gnu), не требуется внешняя библиотека.

Модуль `dbm.dumb` определяет следующее:

#### `exception dbm.dumb.error`

Возникает при ошибках, специфичных для [`dbm.dumb`](https://python-all.ru/3.12/library/dbm.html#module-dbm.dumb), например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.

#### `dbm.dumb.open(filename, flag='c', mode=0o666)`

Открывает базу данных `dbm.dumb`. Возвращаемый объект базы данных ведет себя подобно [отображению](https://python-all.ru/3.12/glossary.html#term-mapping), а также предоставляет методы [`sync()`](https://python-all.ru/3.12/library/dbm.html#dbm.dumb.dumbdbm.sync) и [`close()`](https://python-all.ru/3.12/library/dbm.html#dbm.dumb.dumbdbm.close).

**Параметры:**

- **filename** –

  Базовое имя файла базы данных (без расширений). При создании новой базы данных появляются следующие файлы:

  - `filename.dat`
  - `filename.dir`
- **flag** ([*str*](https://python-all.ru/3.12/library/stdtypes.html#str)) –

  - `'r'`: Открыть существующую базу данных только для чтения.
  - `'w'`: Открыть существующую базу данных для чтения и записи.
  - `'c'` (по умолчанию): Открыть базу данных для чтения и записи, создавая её, если она не существует.
  - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.
- **mode** ([*int*](https://python-all.ru/3.12/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.

> **Предупреждение**
>
> Интерпретатор Python может аварийно завершиться при загрузке базы данных со достаточно большой/сложной записью из-за ограничений глубины стека в компиляторе AST Python.

Изменено в версии 3.5: [`open()`](https://python-all.ru/3.12/library/dbm.html#dbm.dumb.open) всегда создаёт новую базу данных, когда *flag* равен `'n'`.

Изменено в версии 3.8: База данных открывается только для чтения, если *flag* равен `'r'`. База данных не создаётся, если она не существует, когда *flag* равен `'r'` или `'w'`.

Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.12/glossary.html#term-path-like-object).

В дополнение к методам, предоставляемым классом [`collections.abc.MutableMapping`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MutableMapping), предоставлены следующие методы:

#### `dumbdbm.sync()`

Синхронизировать каталог на диске и файлы данных. Этот метод вызывается методом [`shelve.Shelf.sync()`](https://python-all.ru/3.12/library/shelve.html#shelve.Shelf.sync).

#### `dumbdbm.close()`

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