一、基本概念
关系数据库并不是Python程序员唯一可用的解决方案。通常,对象数据库可能更适合解决某些问题。ZODB是一个可扩展和冗余的对象数据库,其专注于存储可扩展的对象,而没有天生“对象-关系”不匹配情况:在尝试将面向对象的语言与关系查询系统映射对象建立关系时,可能会出现这种不匹配情况。
二、ZODB使用
  • 建立和断开与ZODB的连接
连接到ZODB的标准方法设计创建四个对象:存储数据库数据的方法、围绕存储并未存储提供实际数据库行为“db”包装、启动与该数据库的特定会话“connection”对象、允许我们访问包含在数据库中的对象层次结构的根的“dbroot”对象。以下所有代码示例都需要将下面代码片段放在Python文件中的示例代码前面,以便正确地打开和关闭ZODB示例:
使用ZODB
#-*-coding: UTF-8 -*-
from ZODB import FileStorage, DB
import transactionclass MyZODB(object):def __init__(self, path):self.storage = FileStorage.FileStorage(path)self.db = DB(self.storage)self.connection = self.db.open()self.dbroot = self.connection.root()def close(self):self.connection.close()self.db.close()self.storage.close()
  • 存储简单Python数据
ZODB数据库可以存储所有类型的Python对象。
存储简单Python数据
from myzodb import MyZODB, transactiondb = MyZODB('./Data.fs')dbroot = db.dbrootdbroot['a_number'] = 3dbroot['a_string'] = 'Gift'dbroot['a_list'] = [1, 2, 3, 5, 7, 12]dbroot['a_dictionary'] = { 1918: 'Red Sox', 1919: 'Reds' }dbroot['deeply_nested'] = {1918: [ ('Red Sox', 4), ('Cubs', 2) ],1919: [ ('Reds', 5), ('White Sox', 3) ],}transaction.commit()db.close()
获取简单数据
from myzodb import MyZODB
db = MyZODB('./Data.fs')
dbroot = db.dbroot
for key in dbroot.keys():
print key + ':', dbroot[key]
db.close()

运行结果:

注意:我们使用文件名"Data.fs"纯粹是为了遵循传统,因为许多ZODB安装在使用特定文件名方面实际上已经实现了标准化,你可以随心所欲地使用任何名称。
更改简单数据
当将某个键设置为新值,ZODB始终能够了解这一点。因此,对上面的数据库进行类型如下的更改将会自动别检测和持久化:
db = MyZODB('./Data.fs')dbroot = db.dbrootdbroot['a_string'] = 'Something Else' transaction.commit() db.close()

但是,需要显示地将对列表或字典的更改告诉ZODB,因为ZODB无法了解所做的更改。这是持久性框架中的一个规定的可变性和参与功能。下面的代码不会导致ZODB看到更改:

a_dictionary = dbroot['a_dictionary']
a_dictionary[1920] = 'Indians'
transaction.commit()
db.close()
如果打算更改——而不是完全替换——类似如此的复杂对象,需要设置数据库根的属性 _p_changed,以通知它需要重新存储其下的属性:
a_dictionary = dbroot['a_dictionary']
a_dictionary[1920] = 'Indians'
db._p_changed = 1
transaction.commit()
db.close()
删除对象:
del dbroot['a_number']
transaction.commit()
db.close()
注意:如果没有调用transaction.commit(),则上面更改都不会对数据库产生任何影响。正如在关系数据库中一样,只有通过提交已执行的操作,这些操作才会出现在数据库里。
  • 持久化对象
当然,很少有Python程序员希望使用上面的诸如列表、元祖和字典等日益复杂的数据结构。相反,希望创建全能的Python对象,并且其属性将会自动地持久化。下面介绍如何定义一个可持久到数据库的类型。为此,该类将必须从Persistent继承。
from persistent import Persistent
class Host(Persistent):def __init__(self, hostname, ip, interfaces):self.hostname = hostnameself.ip = ipself.interfaces = interfaces
存储对象
现在可以创建该类的几个实例,并在ZODB中将其持久化:
from mymodel import Hosthost1 = Host('www.example.com', '192.168.7.2', ['eth0', 'eth1'])dbroot['www.example.com'] = host1host2 = Host('dns.example.com', '192.168.7.4', ['eth0', 'gige0'])dbroot['dns.example.com'] = host2transaction.commit()db.close()
获取对象
from mymodel import Hostfor key in dbroot.keys():obj = dbroot[key]if isinstance(obj, Host):print "Host:", obj.hostnameprint " IP address:", obj.ip, " Interfaces:", obj.interfacesdb.close()

更改对象

正如“dhroot”对象能够自动检测在其键索引处放置的值一样,持久化对象将在您设置其属性时,自动执行检测,并将属性保存到数据库。
host = dbroot['www.example.com']
host.ip = '192.168.7.141'
transaction.commit()
db.close()
但是,如果您在某个对象下面存储复杂数据类型,则会出现与连接到数据根的复杂数据类型完全相同的问题。必须像前面一样设置 _p_changed 属性:
host = dbroot['www.example.com']
host.interfaces.append('eth2')
host._p_changed = 1
transaction.commit()
db.close()
最后,ZODB数据库实例很容易维护。由于ZODB数据库实例不包含需要设计或修改的模式,要执行的唯一例行维护是定期压缩以防止其耗尽整个磁盘。为了支持事务回滚,写到ZODB数据库的每个新的更改实际上都是追加到“Data.fs”文件,而不是更新该文件中已经存在的信息。要删除随着事务提交二积累的旧信息,ZODB管理员必须偶尔对其数据进行压缩。
注意:一次只有一个程序能够安全地打开“Data.fs”文件
参考地址:http://www.ibm.com/developerworks/cn/aix/library/au-zodb/
ZODB官方:http://www.zodb.org

3.4Python之对象数据库ZODB相关推荐

  1. 发现数据对象 -- 数据库开发的关键

    发现数据对象 -- 数据库开发的关键   不管你是开发简单的数据库系统,还是复杂的系统甚至是做数据仓库,选用Sybase或Oracle,乃至简单的用Access或Foxpro,只要是关系型数据库都难免 ...

  2. Facebook将偷来的3D对象数据库用于其AI项目:被诉讼

    立陶宛公司称:研究人员偷走了我们的3D文件,随后统统给了Facebook的AI研究人员. 据一家花费多年和几百万美元来收集整理数据集的立陶宛公司声称,Facebook将窃取的3D对象数据库用于其AI项 ...

  3. db4o_8.0对象数据库官方文档翻译_学习笔记三

    紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not  ...

  4. 常见的对象数据库有哪些

    ObjectDB:Java对象数据库,支持JPA和JDO标准,使用对象图来存储和查询数据. db4o:Java和.NET平台的对象数据库,支持LINQ和原生查询语言. Versant Object D ...

  5. 对象数据库与关系数据库利弊谈

    在20世纪60年代后期引入的面向对象技术引起了一场革命.到20世纪80年代后,面向对象的技术已经成为 了行业的主流,其原因多种多样:面向对象不仅简化了界面的开发,而且也提供了一种更加灵活.简单数据处理 ...

  6. 用对象数据库引擎探索全球气候变暖问题

    [b]大数据:用对象数据库引擎探索全球气候变暖问题[/b] 我们不能把北极塞进关系型数据库里面.这是研究世界各地的冰雪气候的大卫加拉赫在设计一个解答基础性问题的系统时发现的,这个问题就是:" ...

  7. 对应到对象 数据库驼峰_【GI的自主空间数据库】一种竞争力,叫技术引领;一种竞争力,叫时间沉淀...

    引子:GI的自主空间数据库及GIS框架来自于求学时MAPGIS的引导,工作时ARCGIS的追随,读博时IBM和Microsoft2篇文献....即使在大数据技术发展的今天,自主空间数据库存储仍然有其技 ...

  8. android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android

    我只是试图让存储在我的JSON文件中的值,并将其保存到SQLite数据库:解析嵌套的JSON对象,并存储在数据库中的Android 这是我的JSON文件: { "list": { ...

  9. 对应到对象 数据库驼峰_SpringJPA底层DAO查询的写法归类总结

    如果你要使用JPA就行底层操作,那么会涉及到很多查询的代码编写,虽然JPA屏蔽了复杂代码的编写,但是还是需要我们根据业务逻辑来编写一些额外的接口代码. 这里就来归纳总结下一些查询写法的编码示例. HQ ...

最新文章

  1. iOS 新窗口在最上层
  2. TOPCODER SAM 686 div1 300
  3. android 处理双击事件
  4. 记一次死锁问题的排查和解决
  5. 一句命令行检查cpu个数
  6. 惊呆!骑士一天收入过万?顺丰同城回应:用户打赏约7856元
  7. 敏捷开发系列学习总结(13)——Spotify敏捷模式详解三部曲第一篇:研发团队
  8. ZYNQ7020 Soc最小系统创建及测试
  9. 4、web(js):js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法
  10. 爬取王者荣耀皮肤图片
  11. 什么是邮箱个人签名?邮箱如何设置个人签名?
  12. 常见端口对应服务及入侵方式
  13. 【云原生 | 19】Docker数据存储详解
  14. Wex5 popOver组件的使用
  15. 哈拉比数据库;为了家人
  16. 计算机网络知识全面讲解:域名解析的过程
  17. 彻底删除wine安装的软件
  18. 数据库和表的基础练习之水果商店
  19. 基于单片机智力竞赛抢答器的设计-毕设课设资料
  20. SystemUI 下拉通知栏快捷键加载流程

热门文章

  1. 无字天书之Python第一页(环境搭建)
  2. 用“Whitespace”编程语言编写无字天书
  3. jQuery插件和JavaScript库
  4. 使用百度地图api模拟实时定位页面 完整示例
  5. setTimeout面试题
  6. dubbo的调用原理及泛化调用
  7. SOLIDWORKS装配体可视化
  8. 一天一个linux小技巧|.(点)是什么意思
  9. DAY12-----生成器
  10. C++ Primer Plus (第六版)源代码