Python 持久化管理之 Pickle/ZODB

來源:互聯網
上載者:User

標籤:

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的資料存放區形式, 是多選的, 可以是普通檔案(FileStorage), 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()    

運行結果如下:

 

Python 持久化管理之 Pickle/ZODB

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.