:mod:`!dbm` --- Interfaces to Unix "databases"
==============================================

.. module:: dbm
   :synopsis: Interfaces to various Unix "database" formats.

**Source code:** :source:`Lib/dbm/__init__.py`

--------------

:mod:`!dbm` is a generic interface to variants of the DBM database:

* :mod:`dbm.sqlite3`
* :mod:`dbm.gnu`
* :mod:`dbm.ndbm`

If none of these modules are installed, the
slow-but-simple implementation in module :mod:`dbm.dumb` will be used. There
is a `third party interface <https://www.jcea.es/programacion/pybsddb.htm>`_ to
the Oracle Berkeley DB.

.. note::
   None of the underlying modules will automatically shrink the disk space used by
   the database file. However, :mod:`dbm.sqlite3`, :mod:`dbm.gnu` and :mod:`dbm.dumb`
   provide a :meth:`!reorganize` method that can be used for this purpose.


.. exception:: error

   A tuple containing the exceptions that can be raised by each of the supported
   modules, with a unique exception also named :exc:`dbm.error` as the first
   item --- the latter is used when :exc:`dbm.error` is raised.


.. function:: whichdb(filename)

   This function attempts to guess which of the several simple database modules
   available --- :mod:`dbm.sqlite3`, :mod:`dbm.gnu`, :mod:`dbm.ndbm`,
   or :mod:`dbm.dumb` --- should be used to open a given file.

   Return one of the following values:

   * ``None`` if the file can't be opened because it's unreadable or doesn't exist
   * the empty string (``''``) if the file's format can't be guessed
   * a string containing the required module name, such as ``'dbm.ndbm'`` or ``'dbm.gnu'``

   .. versionchanged:: 3.11
      *filename* accepts a :term:`path-like object`.

.. Substitutions for the open() flag param docs;
   all submodules use the same text.

.. |flag_r| replace::
   Open existing database for reading only.

.. |flag_w| replace::
   Open existing database for reading and writing.

.. |flag_c| replace::
   Open database for reading and writing, creating it if it doesn't exist.

.. |flag_n| replace::
   Always create a new, empty database, open for reading and writing.

.. |mode_param_doc| replace::
   The Unix file access mode of the file (default: octal ``0o666``),
   used only when the database has to be created.

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

   Open a database and return the corresponding database object.

   :param file:
      The database file to open.

      If the database file already exists, the :func:`whichdb` function is used to
      determine its type and the appropriate module is used; if it does not exist,
      the first submodule listed above that can be imported is used.
   :type file: :term:`path-like object`

   :param str flag:
      * ``'r'`` (default): |flag_r|
      * ``'w'``: |flag_w|
      * ``'c'``: |flag_c|
      * ``'n'``: |flag_n|

   :param int mode:
      |mode_param_doc|

   .. versionchanged:: 3.11
      *file* accepts a :term:`path-like object`.

The object returned by :func:`~dbm.open` supports the basic
functionality of mutable :term:`mappings <mapping>`;
keys and their corresponding values can be stored, retrieved, and
deleted, and iteration, the :keyword:`in` operator and methods :meth:`!keys`,
:meth:`!get`, :meth:`!setdefault` and :meth:`!clear` are available.
The :meth:`!keys` method returns a list instead of a view object.
The :meth:`!setdefault` method requires two arguments.

Key and values are always stored as :class:`bytes`. This means that when
strings are used they are implicitly converted to the default encoding before
being stored.

These objects also support being used in a :keyword:`with` statement, which
will automatically close them when done.

.. versionchanged:: 3.2
   :meth:`!get` and :meth:`!setdefault` methods are now available for all
   :mod:`!dbm` backends.

.. versionchanged:: 3.4
   Added native support for the context management protocol to the objects
   returned by :func:`~dbm.open`.

.. versionchanged:: 3.8
   Deleting a key from a read-only database raises a database module specific exception
   instead of :exc:`KeyError`.

.. versionchanged:: 3.13
   :meth:`!clear` methods are now available for all :mod:`!dbm` backends.


The following example records some hostnames and a corresponding title,  and
then prints out the contents of the database::

   import dbm

   # Open database, creating it if necessary.
   with dbm.open('cache', 'c') as db:

       # Record some values
       db[b'hello'] = b'there'
       db['www.python.org'] = 'Python Website'
       db['www.cnn.com'] = 'Cable News Network'

       # Note that the keys are considered bytes now.
       assert db[b'www.python.org'] == b'Python Website'
       # Notice how the value is now in bytes.
       assert db['www.cnn.com'] == b'Cable News Network'

       # Often-used methods of the dict interface work too.
       print(db.get('python.org', b'not present'))

       # Storing a non-string key or value will raise an exception (most
       # likely a TypeError).
       db['www.yahoo.com'] = 4

   # db is automatically closed when leaving the with statement.


.. seealso::

   Module :mod:`shelve`
      Persistence module which stores non-string data.


The individual submodules are described in the following sections.

:mod:`!dbm.sqlite3` --- SQLite backend for dbm
----------------------------------------------

.. module:: dbm.sqlite3
   :synopsis: SQLite backend for dbm

.. versionadded:: 3.13

**Source code:** :source:`Lib/dbm/sqlite3.py`

--------------

This module uses the standard library :mod:`sqlite3` module to provide an
SQLite backend for the :mod:`!dbm` module.
The files created by :mod:`!dbm.sqlite3` can thus be opened by :mod:`sqlite3`,
or any other SQLite browser, including the SQLite CLI.

.. include:: ../includes/wasm-notavail.rst

.. function:: open(filename, /, flag="r", mode=0o666)

   Open an SQLite database.

   :param filename:
      The path to the database to be opened.
   :type filename: :term:`path-like object`

   :param str flag:

      * ``'r'`` (default): |flag_r|
      * ``'w'``: |flag_w|
      * ``'c'``: |flag_c|
      * ``'n'``: |flag_n|

   :param mode:
      The Unix file access mode of the file (default: octal ``0o666``),
      used only when the database has to be created.

   The returned database object behaves similar to a mutable :term:`mapping`,
   but the :meth:`!keys` method returns a list, and
   the :meth:`!setdefault` method requires two arguments.
   It also supports a "closing" context manager via the :keyword:`with` keyword.

   The following methods are also provided:

   .. method:: sqlite3.close()

      Close the SQLite database.

   .. method:: sqlite3.reorganize()

      If you have carried out a lot of deletions and would like to shrink the space
      used on disk, this method will reorganize the database; otherwise, deleted file
      space will be kept and reused as new (key, value) pairs are added.

      .. note::
         While reorganizing, as much as two times the size of the original database is required
         in free disk space. However, be aware that this factor changes for each :mod:`!dbm` submodule.

      .. versionadded:: 3.15


:mod:`!dbm.gnu` --- GNU database manager
----------------------------------------

.. module:: dbm.gnu
   :synopsis: GNU database manager

**Source code:** :source:`Lib/dbm/gnu.py`

--------------

The :mod:`!dbm.gnu` module provides an interface to the :abbr:`GDBM (GNU dbm)`
library, similar to the :mod:`dbm.ndbm` module, but with additional
functionality like crash tolerance.

.. note::

   The file formats created by :mod:`!dbm.gnu` and :mod:`dbm.ndbm` are incompatible
   and can not be used interchangeably.

.. include:: ../includes/wasm-mobile-notavail.rst

.. availability:: Unix.

.. exception:: error

   Raised on :mod:`!dbm.gnu`-specific errors, such as I/O errors. :exc:`KeyError` is
   raised for general mapping errors like specifying an incorrect key.


.. data:: open_flags

   A string of characters the *flag* parameter of :meth:`~dbm.gnu.open` supports.


.. function:: open(filename, flag="r", mode=0o666, /)

   Open a GDBM database and return a :class:`!gdbm` object.

   :param filename:
      The database file to open.
   :type filename: :term:`path-like object`

   :param str flag:
      * ``'r'`` (default): |flag_r|
      * ``'w'``: |flag_w|
      * ``'c'``: |flag_c|
      * ``'n'``: |flag_n|

      The following additional characters may be appended
      to control how the database is opened:

      * ``'f'``: Open the database in fast mode.
        Writes to the database will not be synchronized.
      * ``'s'``: Synchronized mode.
        Changes to the database will be written immediately to the file.
      * ``'u'``: Do not lock database.

      Not all flags are valid for all versions of GDBM.
      See the :data:`open_flags` member for a list of supported flag characters.

   :param int mode:
      |mode_param_doc|

   :raises error:
      If an invalid *flag* argument is passed.

   .. versionchanged:: 3.11
      *filename* accepts a :term:`path-like object`.

   :class:`!gdbm` objects behave similar to mutable :term:`mappings <mapping>`,
   but methods :meth:`!items`, :meth:`!values`, :meth:`!pop`, :meth:`!popitem`,
   and :meth:`!update` are not supported,
   the :meth:`!keys` method returns a list, and
   the :meth:`!setdefault` method requires two arguments.
   It also supports a "closing" context manager via the :keyword:`with` keyword.

   .. versionchanged:: 3.2
      Added the :meth:`!get` and :meth:`!setdefault` methods.

   .. versionchanged:: 3.13
      Added the :meth:`!clear` method.

   The following methods are also provided:

   .. method:: gdbm.close()

      Close the GDBM database.

   .. method:: gdbm.firstkey()

      It's possible to loop over every key in the database using this method  and the
      :meth:`nextkey` method.  The traversal is ordered by GDBM's internal
      hash values, and won't be sorted by the key values.  This method returns
      the starting key.

   .. method:: gdbm.nextkey(key)

      Returns the key that follows *key* in the traversal.  The following code prints
      every key in the database ``db``, without having to create a list in memory that
      contains them all::

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

   .. method:: gdbm.reorganize()

      If you have carried out a lot of deletions and would like to shrink the space
      used by the GDBM file, this routine will reorganize the database.  :class:`!gdbm`
      objects will not shorten the length of a database file except by using this
      reorganization; otherwise, deleted file space will be kept and reused as new
      (key, value) pairs are added.

      .. note::
         While reorganizing, as much as one time the size of the original database is required
         in free disk space. However, be aware that this factor changes for each :mod:`!dbm` submodule.

   .. method:: gdbm.sync()

      When the database has been opened in fast mode, this method forces any
      unwritten data to be written to the disk.


:mod:`!dbm.ndbm` --- New Database Manager
-----------------------------------------

.. module:: dbm.ndbm
   :synopsis: The New Database Manager

**Source code:** :source:`Lib/dbm/ndbm.py`

--------------

The :mod:`!dbm.ndbm` module provides an interface to the
:abbr:`NDBM (New Database Manager)` library.
This module can be used with the "classic" NDBM interface or the
:abbr:`GDBM (GNU dbm)` compatibility interface.

.. note::

   The file formats created by :mod:`dbm.gnu` and :mod:`!dbm.ndbm` are incompatible
   and can not be used interchangeably.

.. warning::

   The NDBM library shipped as part of macOS has an undocumented limitation on the
   size of values, which can result in corrupted database files
   when storing values larger than this limit. Reading such corrupted files can
   result in a hard crash (segmentation fault).

.. include:: ../includes/wasm-mobile-notavail.rst

.. availability:: Unix.

.. exception:: error

   Raised on :mod:`!dbm.ndbm`-specific errors, such as I/O errors. :exc:`KeyError` is raised
   for general mapping errors like specifying an incorrect key.


.. data:: library

   Name of the NDBM implementation library used.


.. function:: open(filename, flag="r", mode=0o666, /)

   Open an NDBM database and return an :class:`!ndbm` object.

   :param filename:
      The basename of the database file
      (without the :file:`.dir` or :file:`.pag` extensions).
   :type filename: :term:`path-like object`

   :param str flag:
      * ``'r'`` (default): |flag_r|
      * ``'w'``: |flag_w|
      * ``'c'``: |flag_c|
      * ``'n'``: |flag_n|

   :param int mode:
      |mode_param_doc|

   .. versionchanged:: 3.11
      Accepts :term:`path-like object` for filename.

   :class:`!ndbm` objects behave similar to mutable :term:`mappings <mapping>`,
   but methods :meth:`!items`, :meth:`!values`, :meth:`!pop`, :meth:`!popitem`,
   and :meth:`!update` are not supported,
   the :meth:`!keys` method returns a list, and
   the :meth:`!setdefault` method requires two arguments.
   It also supports a "closing" context manager via the :keyword:`with` keyword.

   .. versionchanged:: 3.2
      Added the :meth:`!get` and :meth:`!setdefault` methods.

   .. versionchanged:: 3.13
      Added the :meth:`!clear` method.

   The following method is also provided:

   .. method:: ndbm.close()

      Close the NDBM database.


:mod:`!dbm.dumb` --- Portable DBM implementation
------------------------------------------------

.. module:: dbm.dumb
   :synopsis: Portable implementation of the simple DBM interface.

**Source code:** :source:`Lib/dbm/dumb.py`

.. index:: single: databases

.. note::

   The :mod:`!dbm.dumb` module is intended as a last resort fallback for the
   :mod:`!dbm` module when a more robust module is not available. The :mod:`!dbm.dumb`
   module is not written for speed and is not nearly as heavily used as the other
   database modules.

--------------

The :mod:`!dbm.dumb` module provides a persistent :class:`dict`-like
interface which is written entirely in Python.
Unlike other :mod:`!dbm` backends, such as :mod:`dbm.gnu`, no
external library is required.

The :mod:`!dbm.dumb` module defines the following:

.. exception:: error

   Raised on :mod:`!dbm.dumb`-specific errors, such as I/O errors.  :exc:`KeyError` is
   raised for general mapping errors like specifying an incorrect key.


.. function:: open(filename, flag="c", mode=0o666)

   Open a :mod:`!dbm.dumb` database.

   :param filename:
      The basename of the database file (without extensions).
      A new database creates the following files:

      - :file:`{filename}.dat`
      - :file:`{filename}.dir`
   :type database: :term:`path-like object`

   :param str flag:
      * ``'r'``: |flag_r|
      * ``'w'``: |flag_w|
      * ``'c'`` (default): |flag_c|
      * ``'n'``: |flag_n|

   :param int mode:
      |mode_param_doc|

   .. warning::
      It is possible to crash the Python interpreter when loading a database
      with a sufficiently large/complex entry due to stack depth limitations in
      Python's AST compiler.

   .. warning::
      :mod:`!dbm.dumb` does not support concurrent read/write access. (Multiple
      simultaneous read accesses are safe.) When a program has the database open
      for writing, no other program should have it open for reading or writing.

   .. versionchanged:: 3.5
      :func:`~dbm.dumb.open` always creates a new database when *flag* is ``'n'``.

   .. versionchanged:: 3.8
      A database opened read-only if *flag* is ``'r'``.
      A database is not created if it does not exist if *flag* is ``'r'`` or ``'w'``.

   .. versionchanged:: 3.11
      *filename* accepts a :term:`path-like object`.

   The returned database object behaves similar to a mutable :term:`mapping`,
   but the :meth:`!keys` and :meth:`!items` methods return lists, and
   the :meth:`!setdefault` method requires two arguments.
   It also supports a "closing" context manager via the :keyword:`with` keyword.

   The following methods are also provided:

   .. method:: dumbdbm.close()

      Close the database.

   .. method:: dumbdbm.reorganize()

      If you have carried out a lot of deletions and would like to shrink the space
      used on disk, this method will reorganize the database; otherwise, deleted file
      space will not be reused.

      .. note::
         While reorganizing, no additional free disk space is required. However, be aware
         that this factor changes for each :mod:`!dbm` submodule.

      .. versionadded:: 3.15

   .. method:: dumbdbm.sync()

      Synchronize the on-disk directory and data files.  This method is called
      by the :meth:`shelve.Shelf.sync` method.
