dbm.md
1> **Источник:** https://python-all.ru/3.13/library/dbm.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `dbm` – Интерфейсы к Unix-«базам данных»89**Исходный код:** [Lib/dbm/\_\_init\_\_.py](https://python-all.ru/src/3.13/Lib/dbm/__init__.py)1011---1213`dbm` – это универсальный интерфейс к разновидностям базы данных DBM:1415- [`dbm.sqlite3`](https://python-all.ru/3.13/library/dbm.html#module-dbm.sqlite3)16- [`dbm.gnu`](https://python-all.ru/3.13/library/dbm.html#module-dbm.gnu)17- [`dbm.ndbm`](https://python-all.ru/3.13/library/dbm.html#module-dbm.ndbm)1819Если ни один из этих модулей не установлен, будет использоваться медленная, но простая реализация в модуле [`dbm.dumb`](https://python-all.ru/3.13/library/dbm.html#module-dbm.dumb). Существует [сторонний интерфейс](https://python-all.ru/3.13/library/dbm.html) к Oracle Berkeley DB.2021#### `exception dbm.error`2223Кортеж, содержащий исключения, которые могут быть возбуждены каждым из поддерживаемых модулей, причём уникальное исключение с именем [`dbm.error`](https://python-all.ru/3.13/library/dbm.html#dbm.error) является первым элементом – последнее используется, когда возбуждается `dbm.error`.2425#### `dbm.whichdb(filename)`2627Эта функция пытается определить, какой из нескольких доступных простых модулей баз данных – [`dbm.sqlite3`](https://python-all.ru/3.13/library/dbm.html#module-dbm.sqlite3), [`dbm.gnu`](https://python-all.ru/3.13/library/dbm.html#module-dbm.gnu), [`dbm.ndbm`](https://python-all.ru/3.13/library/dbm.html#module-dbm.ndbm) или [`dbm.dumb`](https://python-all.ru/3.13/library/dbm.html#module-dbm.dumb) – следует использовать для открытия данного файла.2829Возвращает одно из следующих значений:3031- `None`, если файл не может быть открыт, так как он нечитаем или не существует32- пустая строка (`''`), если формат файла не удаётся определить33- строка, содержащая имя требуемого модуля, например `'dbm.ndbm'` или `'dbm.gnu'`3435Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.13/glossary.html#term-path-like-object).3637#### `dbm.open(file, flag='r', mode=0o666)`3839Открывает базу данных и возвращает соответствующий объект базы данных.4041**Параметры:**4243- **file** ([объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object)) –4445 Файл базы данных для открытия.4647 Если файл базы данных уже существует, для определения его типа используется функция [`whichdb()`](https://python-all.ru/3.13/library/dbm.html#dbm.whichdb), и применяется соответствующий модуль; если файл не существует, используется первый подмодуль из перечисленных выше, который можно импортировать.48- **flag** ([*str*](https://python-all.ru/3.13/library/stdtypes.html#str)) –4950 - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.51 - `'w'`: Открыть существующую базу данных для чтения и записи.52 - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.53 - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.54- **mode** ([*int*](https://python-all.ru/3.13/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.5556Изменено в версии 3.11: *file* теперь принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).5758Объект, возвращаемый [`open()`](https://python-all.ru/3.13/library/dbm.html#dbm.open), поддерживает базовую функциональность изменяемых [отображений](https://python-all.ru/3.13/glossary.html#term-mapping); ключи и соответствующие им значения могут сохраняться, извлекаться и удаляться, а также доступны итерация, оператор [`in`](https://python-all.ru/3.13/reference/expressions.html#in) и методы `keys()`, `get()`, `setdefault()` и `clear()`. Метод `keys()` возвращает список, а не объект представления. Метод `setdefault()` требует два аргумента.5960Ключи и значения всегда хранятся как [`bytes`](https://python-all.ru/3.13/library/stdtypes.html#bytes). Это означает, что при использовании строк они неявно преобразуются в кодировку по умолчанию перед сохранением.6162Эти объекты также поддерживают использование в операторе [`with`](https://python-all.ru/3.13/reference/compound_stmts.html#with), который автоматически закроет их по завершении.6364Изменено в версии 3.2: `get()` и `setdefault()` методы теперь доступны для всех бэкендов `dbm`.6566Изменено в версии 3.4: Добавлена встроенная поддержка протокола управления контекстом для объектов, возвращаемых [`open()`](https://python-all.ru/3.13/library/dbm.html#dbm.open).6768Изменено в версии 3.8: Удаление ключа из базы данных только для чтения теперь возбуждает исключение, специфичное для модуля базы данных, вместо [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError).6970Изменено в версии 3.13: `clear()` методы теперь доступны для всех `dbm` бэкендов.7172Следующий пример записывает несколько имен хостов и соответствующий заголовок, а затем выводит содержимое базы данных:7374```python75import dbm7677# Открыть базу данных, создав её при необходимости.78with dbm.open('cache', 'c') as db:7980 # Записать несколько значений.81 db[b'hello'] = b'there'82 db['www.python.org'] = 'Python Website'83 db['www.cnn.com'] = 'Cable News Network'8485 # Обратите внимание: теперь ключи считаются байтами.86 assert db[b'www.python.org'] == b'Python Website'87 # Обратите внимание, что теперь значение хранится в байтах.88 assert db['www.cnn.com'] == b'Cable News Network'8990 # Часто используемые методы интерфейса dict также работают.91 print(db.get('python.org', b'not present'))9293 # Сохранение нестрокового ключа или значения вызовет исключение (скорее всего,94 # TypeError).95 db['www.yahoo.com'] = 49697# db автоматически закрывается при выходе из оператора with.98```99100> **См. также**101>102> **Модуль [`shelve`](https://python-all.ru/3.13/library/shelve.html#module-shelve)**103>104> Модуль персистентности, который хранит нестроковые данные.105106Отдельные подмодули описаны в следующих разделах.107108## `dbm.sqlite3` – SQLite-бэкенд для dbm109110Добавлено в версии 3.13.111112**Исходный код:** [Lib/dbm/sqlite3.py](https://python-all.ru/src/3.13/Lib/dbm/sqlite3.py)113114---115116Этот модуль использует модуль стандартной библиотеки [`sqlite3`](https://python-all.ru/3.13/library/sqlite3.html#module-sqlite3) для предоставления SQLite-бэкенда для модуля `dbm`. Файлы, созданные `dbm.sqlite3`, могут быть открыты в `sqlite3` или любом другом SQLite-браузере, включая SQLite CLI.117118[Доступность](https://python-all.ru/3.13/library/intro.html#availability): не WASI.119120Этот модуль не работает или недоступен на WebAssembly. Подробнее см. [платформы WebAssembly](https://python-all.ru/3.13/library/intro.html#wasm-availability).121122#### `dbm.sqlite3.open(filename, /, flag='r', mode=0o666)`123124Открывает SQLite-базу данных.125126**Параметры:**127128- **filename** ([path-like object](https://python-all.ru/3.13/glossary.html#term-path-like-object)) – путь к открываемой базе данных.129- **flag** ([*str*](https://python-all.ru/3.13/library/stdtypes.html#str)) –130131 - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.132 - `'w'`: Открыть существующую базу данных для чтения и записи.133 - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.134 - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.135- **mode** – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.136137Возвращаемый объект базы данных ведёт себя подобно изменяемому [mapping](https://python-all.ru/3.13/glossary.html#term-mapping), но метод `keys()` возвращает список, а метод `setdefault()` требует два аргумента. Он также поддерживает контекстный менеджер «closing» с помощью ключевого слова [`with`](https://python-all.ru/3.13/reference/compound_stmts.html#with).138139Также предоставляется следующий метод:140141#### `sqlite3.close()`142143Закрывает SQLite-базу данных.144145## `dbm.gnu` – менеджер баз данных GNU146147**Исходный код:** [Lib/dbm/gnu.py](https://python-all.ru/src/3.13/Lib/dbm/gnu.py)148149---150151Модуль `dbm.gnu` предоставляет интерфейс к библиотеке GDBM, аналогичный модулю [`dbm.ndbm`](https://python-all.ru/3.13/library/dbm.html#module-dbm.ndbm), но с дополнительными возможностями, такими как устойчивость к сбоям.152153> **Примечание**154>155> Форматы файлов, созданные с помощью `dbm.gnu` и [`dbm.ndbm`](https://python-all.ru/3.13/library/dbm.html#module-dbm.ndbm), несовместимы и не могут использоваться взаимозаменяемо.156157[Доступность](https://python-all.ru/3.13/library/intro.html#availability): не Android, не iOS, не WASI.158159Этот модуль не поддерживается на [мобильных платформах](https://python-all.ru/3.13/library/intro.html#mobile-availability) или [платформах WebAssembly](https://python-all.ru/3.13/library/intro.html#wasm-availability).160161[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Unix.162163#### `exception dbm.gnu.error`164165Возбуждается при ошибках, специфичных для `dbm.gnu`, таких как ошибки ввода-вывода. [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) возбуждается для общих ошибок отображения, например, при указании неверного ключа.166167#### `dbm.gnu.open_flags`168169Строка символов, которую поддерживает параметр *flag* функции [`open()`](https://python-all.ru/3.13/library/dbm.html#dbm.gnu.open).170171#### `dbm.gnu.open(filename, flag='r', mode=0o666, /)`172173Открывает базу данных GDBM и возвращает объект `gdbm`.174175**Параметры:**176177- **filename** ([объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object)) – Файл базы данных для открытия.178- **flag** ([*str*](https://python-all.ru/3.13/library/stdtypes.html#str)) –179180 - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.181 - `'w'`: Открыть существующую базу данных для чтения и записи.182 - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.183 - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.184185 К строке флага могут быть добавлены следующие дополнительные символы для управления способом открытия базы данных:186187 - `'f'`: Открыть базу данных в быстром режиме. Записи в базу данных не будут синхронизироваться.188 - `'s'`: Синхронизированный режим. Изменения в базе данных будут немедленно записаны в файл.189 - `'u'`: Не блокировать базу данных.190191 Не все флаги допустимы для всех версий GDBM. Список поддерживаемых символов флагов см. в члене [`open_flags`](https://python-all.ru/3.13/library/dbm.html#dbm.gnu.open_flags).192- **mode** ([*int*](https://python-all.ru/3.13/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.193194**Возбуждает:**195196[**error**](https://python-all.ru/3.13/library/dbm.html#dbm.gnu.error) – Если передан недопустимый аргумент *flag*.197198Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.13/glossary.html#term-path-like-object).199200Объекты `gdbm` ведут себя как изменяемые [отображения](https://python-all.ru/3.13/glossary.html#term-mapping), но методы `items()`, `values()`, `pop()`, `popitem()`, и `update()` не поддерживаются, метод `keys()` возвращает список, а метод `setdefault()` требует два аргумента. Также поддерживается менеджер контекста «закрытие» через ключевое слово [`with`](https://python-all.ru/3.13/reference/compound_stmts.html#with).201202Изменено в версии 3.2: Добавлены методы `get()` и `setdefault()`.203204Изменено в версии 3.13: Добавлен метод `clear()`.205206Также предоставляются следующие методы:207208#### `gdbm.close()`209210Закрывает базу данных GDBM.211212#### `gdbm.firstkey()`213214С помощью этого метода и метода [`nextkey()`](https://python-all.ru/3.13/library/dbm.html#dbm.gnu.gdbm.nextkey) можно выполнять цикл по всем ключам базы данных. Обход упорядочен по внутренним хеш-значениям GDBM, а не по значениям ключей. Этот метод возвращает начальный ключ.215216#### `gdbm.nextkey(key)`217218Возвращает ключ, следующий за *key* при обходе. Следующий код выводит все ключи базы данных `db`, не создавая в памяти список, содержащий их все:219220```python221k = db.firstkey()222while k is not None:223 print(k)224 k = db.nextkey(k)225```226227#### `gdbm.reorganize()`228229Если вы выполнили много удалений и хотите уменьшить пространство, занимаемое файлом GDBM, эта процедура переорганизует базу данных. `gdbm` объекты не уменьшат размер файла базы данных иначе, чем с помощью такой переорганизации; в противном случае освобождённое пространство файла будет сохраняться и повторно использоваться при добавлении новых пар (ключ, значение).230231#### `gdbm.sync()`232233Когда база данных открыта в быстром режиме, этот метод принудительно записывает на диск все незаписанные данные.234235## `dbm.ndbm` – Новый менеджер баз данных236237**Исходный код:** [Lib/dbm/ndbm.py](https://python-all.ru/src/3.13/Lib/dbm/ndbm.py)238239---240241Модуль `dbm.ndbm` предоставляет интерфейс к библиотеке NDBM. Этот модуль можно использовать как с «классическим» интерфейсом NDBM, так и с интерфейсом совместимости GDBM.242243> **Примечание**244>245> Форматы файлов, созданные с помощью [`dbm.gnu`](https://python-all.ru/3.13/library/dbm.html#module-dbm.gnu) и `dbm.ndbm`, несовместимы и не могут использоваться взаимозаменяемо.246247> **Предупреждение**248>249> Библиотека NDBM, поставляемая в составе macOS, имеет недокументированное ограничение на размер значений, что может привести к повреждению файлов базы данных при сохранении значений, превышающих этот лимит. Чтение таких повреждённых файлов может привести к жёсткому сбою (ошибке сегментации).250251[Доступность](https://python-all.ru/3.13/library/intro.html#availability): не Android, не iOS, не WASI.252253Этот модуль не поддерживается на [мобильных платформах](https://python-all.ru/3.13/library/intro.html#mobile-availability) или [платформах WebAssembly](https://python-all.ru/3.13/library/intro.html#wasm-availability).254255[Доступность](https://python-all.ru/3.13/library/intro.html#availability): Unix.256257#### `exception dbm.ndbm.error`258259Возникает при ошибках, специфичных для `dbm.ndbm`, например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.260261#### `dbm.ndbm.library`262263Имя используемой библиотеки реализации NDBM.264265#### `dbm.ndbm.open(filename, flag='r', mode=0o666, /)`266267Открывает базу данных NDBM и возвращает объект `ndbm`.268269**Параметры:**270271- **имя\_файла** ([объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object)) – базовое имя файла базы данных (без расширений `.dir` или `.pag`).272- **flag** ([*str*](https://python-all.ru/3.13/library/stdtypes.html#str)) –273274 - `'r'` (по умолчанию): открывает существующую базу данных только для чтения.275 - `'w'`: Открыть существующую базу данных для чтения и записи.276 - `'c'`: открывает базу данных для чтения и записи, создавая её, если она не существует.277 - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.278- **mode** ([*int*](https://python-all.ru/3.13/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.279280Изменено в версии 3.11: Принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object) для имени файла.281282Объекты `ndbm` ведут себя как изменяемые [отображения](https://python-all.ru/3.13/glossary.html#term-mapping), но методы `items()`, `values()`, `pop()`, `popitem()`, и `update()` не поддерживаются, метод `keys()` возвращает список, а метод `setdefault()` требует два аргумента. Также поддерживается менеджер контекста «закрытие» через ключевое слово [`with`](https://python-all.ru/3.13/reference/compound_stmts.html#with).283284Изменено в версии 3.2: Добавлены методы `get()` и `setdefault()`.285286Изменено в версии 3.13: Добавлен метод `clear()`.287288Также предоставляется следующий метод:289290#### `ndbm.close()`291292Закрывает базу данных NDBM.293294## `dbm.dumb` – переносимая реализация DBM295296**Исходный код:** [Lib/dbm/dumb.py](https://python-all.ru/src/3.13/Lib/dbm/dumb.py)297298> **Примечание**299>300> Модуль `dbm.dumb` предназначен в качестве запасного варианта для модуля `dbm`, когда более надёжный модуль недоступен. Модуль `dbm.dumb` не оптимизирован для скорости и используется не так интенсивно, как другие модули баз данных.301302---303304Модуль `dbm.dumb` предоставляет постоянный (persistent) интерфейс, подобный [`dict`](https://python-all.ru/3.13/library/stdtypes.html#dict), полностью написанный на Python. В отличие от других бэкендов `dbm`, таких как [`dbm.gnu`](https://python-all.ru/3.13/library/dbm.html#module-dbm.gnu), не требуется внешняя библиотека.305306Модуль `dbm.dumb` определяет следующее:307308#### `exception dbm.dumb.error`309310Возникает при ошибках, специфичных для `dbm.dumb`, например, при ошибках ввода-вывода. [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) возникает при общих ошибках отображения, например, при указании неверного ключа.311312#### `dbm.dumb.open(filename, flag='c', mode=0o666)`313314Открывает базу данных `dbm.dumb`.315316**Параметры:**317318- **filename** –319320 Базовое имя файла базы данных (без расширений). При создании новой базы данных появляются следующие файлы:321322 - `filename.dat`323 - `filename.dir`324- **flag** ([*str*](https://python-all.ru/3.13/library/stdtypes.html#str)) –325326 - `'r'`: Открыть существующую базу данных только для чтения.327 - `'w'`: Открыть существующую базу данных для чтения и записи.328 - `'c'` (по умолчанию): Открыть базу данных для чтения и записи, создавая её, если она не существует.329 - `'n'`: Всегда создавать новую пустую базу данных, открытую для чтения и записи.330- **mode** ([*int*](https://python-all.ru/3.13/library/functions.html#int)) – режим доступа к файлу Unix (по умолчанию: восьмеричное `0o666`), используется только при создании базы данных.331332> **Предупреждение**333>334> Интерпретатор Python может аварийно завершиться при загрузке базы данных со достаточно большой/сложной записью из-за ограничений глубины стека в компиляторе AST Python.335336Изменено в версии 3.5: `open()` всегда создаёт новую базу данных, когда *flag* равен `'n'`.337338Изменено в версии 3.8: База данных открывается только для чтения, если *flag* равен `'r'`. База данных не создаётся, если она не существует, когда *flag* равен `'r'` или `'w'`.339340Изменено в версии 3.11: *filename* принимает [path-like object](https://python-all.ru/3.13/glossary.html#term-path-like-object).341342Возвращаемый объект базы данных ведёт себя подобно изменяемому [отображению](https://python-all.ru/3.13/glossary.html#term-mapping), но методы `keys()` и `items()` возвращают списки, а метод `setdefault()` требует два аргумента. Он также поддерживает контекстный менеджер «closing» через ключевое слово [`with`](https://python-all.ru/3.13/reference/compound_stmts.html#with).343344Также предоставляются следующие методы:345346#### `dumbdbm.close()`347348Закрыть базу данных.349350#### `dumbdbm.sync()`351352Синхронизировать каталог на диске и файлы данных. Этот метод вызывается методом [`shelve.Shelf.sync()`](https://python-all.ru/3.13/library/shelve.html#shelve.Shelf.sync).353