dbm — Unix“数据库”的接口

源代码: Lib/dbm/init.py


dbm是 DBM 数据库变体dbm.gnudbm.ndbm的通用接口。如果未安装这些模块,则将使用模块dbm.dumb中的缓慢但简单的实现。 Oracle Berkeley 数据库有第三方界面

  • exception dbm. error

    • 一个 Tuples,其中包含每个受支持模块均可引发的异常,并且唯一异常也称为dbm.error作为第一项,而引发dbm.error则使用后者。
  • dbm. whichdb(* filename *)

    • 此函数try猜测可用的几个简单数据库模块(dbm.gnudbm.ndbmdbm.dumb)中的哪个打开了给定文件。

返回以下值之一:None如果由于不可读或不存在而无法打开文件;如果无法猜测文件的格式,则为空字符串('');或包含所需模块名称的字符串,例如'dbm.ndbm''dbm.gnu'

  • dbm. open(* file flag ='r' mode = 0o666 *)
    • 打开数据库文件* file *并返回相应的对象。

如果数据库文件已经存在,则使用whichdb()函数确定其类型并使用适当的模块;如果不存在,则使用上面列出的第一个可以导入的模块。

可选的* flag *参数可以是:

ValueMeaning
'r'打开现有数据库以只读(默认)
'w'打开现有数据库进行读写
'c'打开数据库进行读写,如果不存在则创建数据库
'n'始终创建一个新的空数据库,以供读取和写入

可选的* mode *参数是文件的 Unix 模式,仅在必须创建数据库时使用。它的默认值为八进制的0o666(并且会被当前的 umask 修改)。

open()返回的对象支持与字典相同的基本Function;键及其对应的值可以存储,检索和删除,并且in运算符和keys()方法以及get()setdefault()都可用。

在版本 3.2 中更改:get()setdefault()现在在所有数据库模块中可用。

在 3.8 版中进行了更改:从只读数据库中删除密钥会引发特定于数据库模块的错误,而不是KeyError

键和值始终存储为字节。这意味着使用字符串时,在存储之前将它们隐式转换为默认编码。

这些对象还支持在with语句中使用,该语句将在完成后自动将其关闭。

在版本 3.4 中进行了更改:向open()返回的对象添加了对上下文 Management 协议的本机支持。

以下示例记录了一些主机名和相应的标题,然后打印出数据库的内容:

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.

See also

  • Module shelve

  • 持久性模块,用于存储非字符串数据。

以下各节介绍了各个子模块。

dbm.gnu — GNU 对 dbm 的重新解释

源代码: Lib/dbm/gnu.py


该模块与dbm模块非常相似,但是使用 GNU 库gdbm来提供一些附加Function。请注意,由dbm.gnudbm.ndbm创建的文件格式不兼容。

dbm.gnu模块提供了 GNU DBM 库的接口。 dbm.gnu.gdbm对象的行为类似于 Map(字典),不同之处在于,在存储之前,键和值始终会转换为字节。打印gdbm对象不会打印键和值,并且不支持items()values()方法。

  • exception dbm.gnu. error

    • 针对dbm.gnu特定的错误(例如 I/O 错误)引发。对于一般的 Map 错误(例如指定了不正确的键),将引发KeyError
  • dbm.gnu. open(* filename * [,* flag * [,* mode *]])

    • 打开一个gdbm数据库并返回一个gdbm对象。 * filename *参数是数据库文件的名称。

可选的* flag *参数可以是:

ValueMeaning
'r'打开现有数据库以只读(默认)
'w'打开现有数据库进行读写
'c'打开数据库进行读写,如果不存在则创建数据库
'n'始终创建一个新的空数据库,以供读取和写入

可以在标志后面附加以下其他字符,以控制如何打开数据库:

ValueMeaning
'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数据库。

dbm.ndbm-基于 ndbm 的接口

源代码: Lib/dbm/ndbm.py


dbm.ndbm模块提供到 Unix“(n)dbm”库的接口。 Dbm 对象的行为类似于 Map(字典),只是键和值始终以字节存储。打印dbm对象不会打印键和值,并且不支持items()values()方法。

该模块可与“经典” ndbm 接口或 GNU GDBM 兼容性接口一起使用。在 Unix 上, configure 脚本将try找到适当的头文件以简化此模块的构建。

  • exception dbm.ndbm. error

    • 针对dbm.ndbm特定的错误(例如 I/O 错误)引发。对于一般的 Map 错误(例如指定了不正确的键),将引发KeyError
  • dbm.ndbm. library

    • 所使用的ndbm实现库的名称。
  • dbm.ndbm. open(* filename * [,* flag * [,* mode *]])

    • 打开 dbm 数据库并返回ndbm对象。 * filename *参数是数据库文件的名称(不带.dir.pagextensions)。

可选的* flag *参数必须是以下值之一:

ValueMeaning
'r'打开现有数据库以只读(默认)
'w'打开现有数据库进行读写
'c'打开数据库进行读写,如果不存在则创建数据库
'n'始终创建一个新的空数据库,以供读取和写入

可选的* mode *参数是文件的 Unix 模式,仅在必须创建数据库时使用。它的默认值为八进制的0o666(并且会被当前的 umask 修改)。

除了类似于字典的方法外,ndbm对象还提供以下方法:

  • ndbm. close ( )
    • 关闭ndbm数据库。

dbm.dumb-便携式 DBM 实施

源代码: Lib/dbm/dumb.py

Note

当没有更健壮的模块时,dbm.dumb模块旨在作为dbm模块的最后手段。 dbm.dumb模块不是为了提高速度而编写的,并且不像其他数据库模块那样频繁使用。


dbm.dumb模块提供了一个类似于字典的持久性接口,该接口完全用 Python 编写。与其他模块(例如dbm.gnu)不同,不需要外部库。与其他持久性 Map 一样,键和值始终存储为字节。

该模块定义以下内容:

  • exception dbm.dumb. error

    • 针对dbm.dumb特定的错误(例如 I/O 错误)引发。对于一般的 Map 错误(例如指定了不正确的键),将引发KeyError
  • dbm.dumb. open(* filename * [,* flag * [,* mode *]])

    • 打开一个dumbdbm数据库并返回 dumbdbm 对象。 * filename *参数是数据库文件的基本名称(没有任何特定的 extensions)。创建 dumbdbm 数据库时,将创建 extensions 为.dat.dir的文件。

可选的* flag *参数可以是:

ValueMeaning
'r'打开现有数据库以只读(默认)
'w'打开现有数据库进行读写
'c'打开数据库进行读写,如果不存在则创建数据库
'n'始终创建一个新的空数据库,以供读取和写入

可选的* mode *参数是文件的 Unix 模式,仅在必须创建数据库时使用。它的默认值为八进制的0o666(并且会被当前的 umask 修改)。

Warning

由于 Python AST 编译器中的堆栈深度限制,在加载具有足够大/复杂条目的数据库时,可能会使 Python 解释器崩溃。

在版本 3.5 中更改:open()始终在标志的值为'n'时创建一个新数据库。

在 3.8 版中进行了更改:现在打开带有标志'r'的数据库为只读。如果标记'r''w'不存在,则不再创建该数据库。

除了collections.abc.MutableMapping类提供的方法外,dumbdbm对象还提供以下方法:

  • dumbdbm. sync ( )

    • 同步磁盘上的目录和数据文件。 Shelve.sync()方法调用此方法。
  • dumbdbm. close ( )

    • 关闭dumbdbm数据库。