12.5. dbm — Unix “数据库”的接口 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/dbm
跳转至:导航、​搜索

12.5. 数据库 — Unix“数据库”的接口

源代码: :source:`Lib/dbm/__init__.py`



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

exception dbm.error
包含每个受支持模块可以引发的异常的元组,唯一的异常也命名为 dbm.error 作为第一项——后者在 dbm.error 时使用被提出。
dbm.whichdb(filename)

此函数试图猜测可用的几个简单数据库模块中的哪一个——dbm.gnudbm.ndbmdbm.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() 和 [ X267X]。

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


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

这些对象还支持在 with 语句中使用,完成后会自动关闭它们。

在 3.4 版更改: open() 返回的对象添加了对上下文管理协议的本机支持。


下面的例子记录了一些主机名和一个对应的标题,然后打印出数据库的内容:

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.

也可以看看

模块 搁架
存储非字符串数据的持久性模块。


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

12.5.1. 数据库文件 — GNU 对 dbm 的重新解释

源代码: :source:`Lib/dbm/gnu.py`



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

dbm.gnu 模块提供了一个到 GNU DBM 库的接口。 dbm.gnu.gdbm 对象的行为类似于映射(字典),除了键和值在存储之前总是转换为字节。 打印 gdbm 对象不会打印键和值,并且不支持 items()values() 方法。

exception dbm.gnu.error
引发 dbm.gnu 特定错误,例如 I/O 错误。 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后面的key。 以下代码打印数据库 db 中的每个键,而无需在内存中创建包含所有键的列表:

k = db.firstkey()
while k != None:
    print(k)
    k = db.nextkey(k)
gdbm.reorganize()

如果您进行了大量删除并希望缩小 gdbm 文件使用的空间,则此例程将重新组织数据库。 gdbm 对象不会缩短数据库文件的长度,除非使用这种重组; 否则,删除的文件空间将被保留并在添加新的(键,值)对时重新使用。

gdbm.sync()

当以快速模式打开数据库时,此方法会强制将任何未写入的数据写入磁盘。

gdbm.close()

关闭 gdbm 数据库。


12.5.2. 数据库文件 — 基于 ndbm 的接口

源代码: :source:`Lib/dbm/ndbm.py`



dbm.ndbm 模块提供了一个到 Unix“(n)dbm”库的接口。 Dbm 对象的行为类似于映射(字典),不同之处在于键和值始终存储为字节。 打印 dbm 对象不会打印键和值,并且不支持 items()values() 方法。

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

exception dbm.ndbm.error
引发 dbm.ndbm 特定错误,例如 I/O 错误。 KeyError 针对一般映射错误(例如指定不正确的密钥)引发。
dbm.ndbm.library
使用的 ndbm 实现库的名称。
dbm.ndbm.open(filename[, flag[, mode]])

打开一个 dbm 数据库并返回一个 ndbm 对象。 filename 参数是数据库文件的名称(没有 .dir.pag 扩展名)。

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

价值

意义

'r'

以只读方式打开现有数据库(默认)

'w'

打开现有数据库进行读写

'c'

打开数据库进行读写,如果不存在则创建

'n'

总是创建一个新的、空的数据库,以读写方式打开

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

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

ndbm.close()

关闭 ndbm 数据库。


12.5.3. 数据库 — 便携式 DBM 实现

源代码: :source:`Lib/dbm/dumb.py`

笔记

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



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

该模块定义了以下内容:

exception dbm.dumb.error
引发 dbm.dumb 特定错误,例如 I/O 错误。 KeyError 针对一般映射错误(例如指定不正确的密钥)引发。
dbm.dumb.open(filename[, flag[, mode]])

打开一个dumbdbm 数据库并返回一个dumbdbm 对象。 filename 参数是数据库文件的基本名称(没有任何特定的扩展名)。 当创建一个dumbdbm 数据库时,会创建带有.dat.dir 扩展名的文件。

可选的 flag 参数仅支持 'c''n' 值的语义。 其他值将默认为始终打开数据库进行更新,如果不存在则创建。

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

在 3.5 版更改:open() 总是在标志具有值 'n' 时创建一个新数据库。

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

dumbdbm.sync()

同步磁盘目录和数据文件。 该方法由 Shelve.sync() 方法调用。

dumbdbm.close()

关闭 dumbdbm 数据库。