返回介绍

步骤7(最后一步):把对象存储到数据库中

发布于 2024-01-29 22:24:15 字数 1709 浏览 0 评论 0 收藏 0

此时,我们的工作几乎完成了。现在,我们有一个两模块的系统,不仅实现了显示人员的最初设计目标,而且提供了一个通用的属性显示工具,可供在未来的其他程序中使用。通过编写模块文件中的函数和类,我们已经确保了它们自然地支持重用。并且,通过把软件编写为类,我们已经确保了它们自然地支持扩展。

尽管我们的类按照计划工作,但是,它们创建的对象还不是真正的数据库记录。也就是说,如果我们关闭Python,实例也将消失——它们是内存中的临时性对象,而没有存储到文件这样的更为持久的媒介中,因此,未来程序运行的时候,它们不再可用。事实证明,让实例对象更加持久是很容易做到的,使用Python一项叫做对象持久化的功能——让对象在创建它们的程序退出之后依然存在。最为本教程的最后一步,让我们把对象持久化。

Pickle和Shelve

对象持久化通过3个标准的库模块来实现,这3个模块在Python中都可用:

pickle

任意Python对象和字节串之间的序列化

dbm(在Python 2.6中叫做anydbm)

实现一个可通过键访问的文件系统,以存储字符串

shelve

使用另两个模块按照键把Python对象存储到一个文件中

我们在第9章中学习文件基础知识的时候简单介绍过这些模块。它们提供了强大的数据存储选项。尽管我们不能在本教程或本书中完全介绍它们,它们还是很简单,一个简单的介绍就足够让你入门了。

pickle模块是一种非常通用的对象格式化和解格式化工具:对于内存中几乎任何的Python对象,它都能聪明地把对象转换为字节串,这个字节串可以随后用来在内存中重新构建最初的对象。pickle模块几乎可以处理我们所能够创建的任何对象,包括列表、字典、嵌套组合以及类实例。后者对于pickle来说特别有用,因为它们提供了数据(属性)和行为(方法),实际上,组合几乎等于“记录”和“程序”。由于pickle如此通用,所以我们可以不用编写代码来创建和解析对象的定制文本文件表示,它可以完全替代这些代码。通过在文件中存储一个对象的pickle字符串,我们可以有效地使其持久化:随后直接载入它并进行unpickle操作,就可以重新创建最初的对象。

尽管使用pickle本身把对象存储为简单的普通文件并随后载入它们是很容易的,但shelve模块提供了一个额外的层结构,允许按照键来存储pickle处理后的对象。Shelve使用pickle把一个对象转换为其pickle化的字符串,并将其存储在一个dbm文件中的键之下;随后载入的时候,shelve通过键获取pickle化的字符串,并用pickle在内存中重新创建最初的对象。这都很有技巧,但是,对于脚本来说,一个shelve的pickle化的对象看上去就像是字典[1]——我们通过键索引来访问、指定键来存储,并且使用len、in和dict.keys这样的字典工具来获取信息。Shelve自动把字典操作映射到存储在文件中的对象。

实际上,对于脚本来说,一个shelve和一个常规的字典之间唯一的编码区别就是,一开始必须打开shelve并且在修改之后必须关闭它。实际的效果是,一个shelve提供了一个简单的数据库来按照键存储和获取本地的Python对象,并由此使它们跨程序运行而保持持久化。它不支持SQL这样的查询工具,并且它缺乏在企业级数据库中可用的某些高级功能(例如,真正的事务处理),但是,一旦使用键获取了存储在shelve中的本地Python对象,就可以使用Python语言的所有功能来处理它。

[1]没错,在Python中,我们把"shelve"用作一个名词,这使得多年来和我合作的编辑以及我所使用的电子文件编辑器懊恼不已。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文