Python 持久化管理之 Pickle/ZODB

1.对象持久化

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

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

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

2. Pickle模块

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

In [3]: import cPickle as pickle

In [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的数据存储形式, 是多选的, 可以是普通文件(FileStorage), DB4和ZEO连接
  • Python类通过继承Persistent可以变为ZODB化的
  • ZODB是基于"事务"的
  • ZODB的逻辑结构是网状结构的, 最基本的ZODB是一棵以root为根的树

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

customer.py      一个继承Persistent的Account类

import persistent

class OutOfFunds(Exception):
    pass

class 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 ZODB
import ZODB.FileStorage as ZFS
import transaction
import customer

class 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()
    

运行结果如下:

时间: 2024-08-29 13:56:22

Python 持久化管理之 Pickle/ZODB的相关文章

windows安装python包管理工具pip

windows安装python包管理工具pip     pip 是一个Python包管理工具,主要是用于安装 PyPI 上的软件包,可以替代 easy_install 工具. 一.前期准备 首先确认windows机器上面是否已经安装好了python.在cmd中输入python --version和python看看是否有反应 如上面所示,表示已经在windows平台上面搭建好了python环境. 二.下载安装 1.到官网去https://pypi.python.org/pypi/pip#downl

利用Python脚本管理Windows服务

Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32serviceutil模块,此模块来自pywin32包,此模块本身有管理服务的功能,有兴趣的可以去阅读它的部分源码. 本脚本存在的目的是为了熟练Python的语法和基本操作,Windows下有更好的命令行工具来管理服务,如sc.Powershell等.通常命令行工具的执行速度要比services.m

[转载]Python 包管理工具解惑

原文链接:http://zengrong.net/post/2169.htm Python 包管理工具解惑 python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? distutils setuptools distribute disutils2 distlib pip 什么时候该用pip,什么时候该用 setup.py ,它们有关系么? easy_install.ez_setup

python自动化管理mysql主从同步

mysql 多实例 1.my.cnf 通过定义mysqldconfig类   mysqld_vars = {}  从里面获得很多配置文件相关参数写入字典 mysql.py 2.init DB 初始化数据库 3.修改权限 4.rc脚本启动 5.check 检查一下配置文件,配置文件与mysql变量同步 6.值其实一样,不让显示 7.Popen 调用 mysql -e 命令 SQL IO Seconds_Behind_Master:0    看这个阀值.大于两秒 8.mysql主从 主配置文件: b

转发:[Python]内存管理

本文为转发,原地址为:http://chenrudan.github.io/blog/2016/04/23/pythonmemorycontrol.html 本文主要为了解释清楚python的内存管理机制,首先介绍了一下python关于内存使用的一些基本概念,然后介绍了引用计数和垃圾回收gc模块,并且解释了分代回收和"标记-清除"法,然后分析了一下各种操作会导致python变量和对象的变化,最后做了一下小结.本来是为了解决前几天遇到把服务器内存耗光的问题,结果后来检查发现并不是因为内存

CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法

之前有的朋友问我,CentOS版本怎么安装python的pip,我之前给出的Ubuntu下apt-get的方法 ubuntu 需要先安装下pip吧, apt-get install python-pip 安装requests, pip install requests 但是有的朋友由于是centos的,直接 yum install pip  或者 yum install python-pip都是不行的. 其实不能yum那就直接下载编译安装呗... CentOS 6.4安装pip,CentOS安装

Retrofit+OKHttp 教你怎么持久化管理Cookie

绪论 最近小编有点忙啊,项目比较紧,所以一直在忙活项目,继之前的自定义组件之后就没再写博客了,如果你没看到之前的自定义组件你可以看一下: Android自定义下拉刷新动画–仿百度外卖下拉刷新 Android自定义组合控件-教你如何自定义下拉刷新和左滑删除 效果还行,源码也已经传到我的Github上了. 那么今天小编来给大家分享点什么呢?对,就是它:Retrofit,话说Retrofit最近真的很火啊,Retrofit+OKHttp现在似乎已经成为了Android网络请求框架的主流框架了吧,小编之

Python内存管理机制

1 概述 对于Python这样的动态语言,如何高效的管理内存,是很重要的一部分,在很大程度上决定了Python的执行效率.与大多数编程语言不同,Python中的变量无需事先申明,变量无需指定类型,程序员无需关心内存管理,Python解释器给你自动回收.我们知道在变量分配内存时,是借用系统资源,在使用完成后,应该归还所借用的系统资源,Python承担了这个复杂的内存管理工作,从而让程序员更加的关注程序的编写质量上. 在执行过程中,Python会频繁的创建和销毁大量的对象,这些都涉及到内存的管理.以

Python包管理工具Distribute的安装

Python包管理工具Distribute的安装 Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute,那麽这几个工具有什么关系呢,看一下下面这个图就明白了: 可以看到distribute是setuptools的替代方案,pip是easy_install的替代方案. Distribute提供一个安装python模块的框架.你系统的每一个python解释器都需要它自己的Distribute.你可以自己找到最新版本的Distribut