博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 持久化管理之 Pickle/ZODB
阅读量:4352 次
发布时间:2019-06-07

本文共 3192 字,大约阅读时间需要 10 分钟。

1.对象持久化

如果希望透明地存储 Python 对象,而不丢失其身份和类型等信息,则需要某种形式的对象序列化:

它是一个将任意复杂的对象转成对象的文本或二进制表示的过程。同样,必须能够将对象经过序列化后的形式恢复到原有的对象。

在 Python 中,这种序列化过程称为 pickle,可以将对象 pickle 成字符串、磁盘上的文件或者任何类似于文件的对象,也可以将这些字符串、文件或任何类似于文件的对象 unpickle 成原来的对象。

 2. Pickle模块

pickle模块就是实现了这样功能的一个模块,代码如下:

In [3]: import cPickle as pickleIn [4]: a1=['apple','banana','orange']In [5]: b1={
'one':1,'two':2,'three':3}In [6]: f=open('temp.pkl','wb')In [7]: pickle.dump(a1,f)In [8]: pickle.dump(b1,f)In [9]: f.close()In [10]: f2 = file('temp.pkl','rb')In [11]: recover1 = pickle.load(f2)In [12]: print recover1['apple', 'banana', 'orange']In [13]: recover2 = pickle.load(f2)In [14]: print recover2{
'one': 1, 'three': 3, 'two': 2}In [15]: f2.close()

 

3. ZODB

 

pickle 模块可以提供这些好处,但有时可能需要比这种简单的 pickle 文件更健壮以及更具有可伸缩性的事物。

例如,只用 pickle 不能解决命名和查找 pickle 文件这样的问题,另外,它也不能支持并发地访问持久性对象。如果需要这些方面的功能,则要求助类似于 ZODB(针对 Python 的 Z 对象数据库)这类数据库。

ZODB (Zope Object Database)是一个健壮的、多用户的和面向对象的数据库系统,它能够存储和管理任意复杂的 Python 对象,并支持事务操作和并发控制。

  • ZODB的数据存储形式, 是多选的, 可以是普通文件(), DB4和ZEO连接

  • Python类通过继承Persistent可以变为ZODB化的
  • ZODB是基于"事务"的
  • ZODB的逻辑结构是网状结构的, 最基本的ZODB是一棵以root为根的树

以下是一个模拟银行存款取款的小例子,使用ZODB来进行存储

 

customer.py      一个继承Persistent的Account类

import persistentclass OutOfFunds(Exception):    passclass Account(persistent.Persistent):    def __init__(self,name,start_balance=0):        self.name = name        self.balance = start_balance    def __str__(self):        return "Account: %s, balance: %s" %(self.name,self.balance)    def __repr__(self):        return "Account: %s, balance: %s" %(self.name,self.balance)    def deposit(self,amount):        """save amount into balance"""        self.balance += amount    def withdraw(self,amount):        """withdraw from balance"""        if amount > self.balance:            raise OutOfFunds        self.balance -= amount        return self.balance

 

模拟银行存款取款 zodb_customer_app.py

import ZODBimport ZODB.FileStorage as ZFSimport transactionimport customerclass ZODBUtils:    conn = None    filestorage = None    def openConnection(self,file_name):        self.filestorage = ZFS.FileStorage(file_name)        db = ZODB.DB(self.filestorage)        self.conn = db.open()        return self.conn    def closeConnection(self):        self.conn.close()        self.filestorage.close()def init_balance():    zodbutils = ZODBUtils()    conn = zodbutils.openConnection('zodb_filestorage.db')    root = conn.root()    noah = customer.Account('noah',1000)    print noah    root['noah'] = noah    jermy = customer.Account('jermy',2000)    print jermy    root['jermy'] = jermy    transaction.commit()    zodbutils.closeConnection()def app():    zodbutils = ZODBUtils()    conn = zodbutils.openConnection('zodb_filestorage.db')    root = conn.root()    noah = root['noah']    print "Before Deposit Or Withdraw"    print "=" * 30    print noah    jermy = root['jermy']    print jermy    print '-' * 30    transaction.begin()    noah.deposit(300)    jermy.withdraw(300)    transaction.commit()    print "After Deposit Or Withdraw"    print "=" * 30    print noah    print jermy    print "-" * 30    zodbutils.closeConnection()if __name__ == '__main__':    # init_balance()    app()

运行结果如下:

 

转载于:https://www.cnblogs.com/chgxtony/p/4340002.html

你可能感兴趣的文章
BZOJ 3527: [Zjoi2014]力 [快速傅里叶变换]
查看>>
LeetCode Palindrome Permutation II
查看>>
LeetCode Minimum Index Sum of Two Lists
查看>>
linux学习系列三
查看>>
细看Thread的 start() 和 run()方法
查看>>
Maven项目无法添加到tomcat
查看>>
查看公司工商注册信息
查看>>
小tip: 使用SVG寥寥数行实现圆环loading进度效果
查看>>
科技发展潮流
查看>>
Reactor-反应器模式
查看>>
Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
查看>>
MVC3+EntityFramework实践笔记
查看>>
一个漂亮的 PlaceHolder
查看>>
jq 中.html(),.text()和.val()的总结
查看>>
ACE OLEDB 12.0连接方式
查看>>
Stack,( Aizu - ALDS1_3_A)
查看>>
javascript_17-基本类型和引用类型
查看>>
django paginator 分页功能
查看>>
java arrayList vector 区别
查看>>
测试思想-文档评审 关于需求评审
查看>>