中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3 shelve對象持久存儲原理詳解

發布時間:2020-10-24 17:04:59 來源:腳本之家 閱讀:151 作者:愛編程的小灰灰 欄目:開發技術

1.shelve對象的持久存儲

不需要關系數據庫時,可以用shelve模塊作為持久存儲Python對象的一個簡單的選擇。類似于字典,shelf按鍵訪問。值將被pickled并寫至由dbm創建和管理的數據庫。

1.1 創建一個新shelf

使用shelve最簡單的方法就是利用DbfilenameShelf類。它使用dbm存儲數據。這個類可以直接使用,也可以通過調用shelve.open()來使用。

import shelve
with shelve.open('test_shelf.db') as s:
  s['key1'] = {
    'int': 10,
    'float': 9.5,
    'string': 'Sample data',
  }

再次訪問這個數據,可以打開shelf,并像字典一樣使用它。

import shelve
with shelve.open('test_shelf.db') as s:
  existing = s['key1']
print(existing)

運行這兩個示例腳本會生成以下輸出。

Python3 shelve對象持久存儲原理詳解

dbm模塊不支持多個應用同時寫同一個數據庫,不過它支持并發的只讀客戶。如果一個客戶沒有修改shelf,則可以通過傳入flag='r'來告訴shelve以只讀方式打開數據庫。

import dbm
import shelve
with shelve.open('test_shelf.db', flag='r') as s:
  print('Existing:', s['key1'])
  try:
    s['key1'] = 'new value'
  except dbm.error as err:
    print('ERROR: {}'.format(err))

如果數據庫作為只讀數據源打開,并且程序試圖修改數據庫,那么便會生成一個訪問錯誤異常。具體的異常類型取決于創建數據庫時dbm選擇的數據庫模塊。

Python3 shelve對象持久存儲原理詳解

1.2 寫回

默認的,shelf不會跟蹤對可變對象的修改。這說明,如果存儲在shelf中的一個元素的內容有變化,那么shelf必須再次存儲整個元素來顯式的更新。

import shelve
with shelve.open('test_shelf.db') as s:
  print(s['key1'])
  s['key1']['new_value'] = 'this was not here before'
with shelve.open('test_shelf.db', writeback=True) as s:
  print(s['key1'])

在這個例子中,沒有再次存儲'key1'的相應字典,所以重新打開shelf時,修改不會保留。

Python3 shelve對象持久存儲原理詳解

對于shelf中存儲的可變對象,要想自動捕獲對它們的修改,可以在打開shelf時啟用寫回(writeback)。writeback標志會讓shelf使用內存中緩存以記住從數據庫獲取的所有對象。shelf關閉時每個緩存對象也被寫回到數據庫。

import shelve
import pprint
with shelve.open('test_shelf.db', writeback=True) as s:
  print('Initial data:')
  pprint.pprint(s['key1'])
  s['key1']['new_value'] = 'this was not here before'
  print('\nModified:')
  pprint.pprint(s['key1'])
with shelve.open('test_shelf.db', writeback=True) as s:
  print('\nPreserved:')
  pprint.pprint(s['key1'])

盡管這會減少程序員犯錯的機會,并且使對象持久存儲更透明,但是并非所有情況都有必要使用寫回模式。打開shelf時緩存會消耗額外的內容,關閉shelf時會暫時將各個緩存對象寫回到數據庫,這會減慢應用的速度。所有緩存的對象都要寫回數據庫,因為無法區分它們是否有修改。如果應用讀取的數據多于寫的數據,那么寫回就會影響性能而沒有太大意義。

Python3 shelve對象持久存儲原理詳解

1.3 特定shelf類型

之前的例子都使用了默認的shelf實現。可以使用shelve.open()而不是直接使用某個shelf實現,這是一種常用的用法,特別是使用什么類型的數據庫來存儲數據并不重要時。不過,有些情況下數據庫格式會很重要。在這些情況下,可以直接使用DbfilenameShelf或BsdDbshelf,或者甚至可以派生Shelf來得到一個定制解決方案。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德庆县| 博野县| 安宁市| 横山县| 慈利县| 阿鲁科尔沁旗| 花莲县| 鄄城县| 景东| 莱州市| 昌图县| 曲阜市| 乌什县| 成安县| 湟源县| 宜春市| 林州市| 安陆市| 泰顺县| 余庆县| 潮安县| 南平市| 灌南县| 南乐县| 江阴市| 通化县| 吉隆县| 宣恩县| 上饶县| 桦甸市| 沙坪坝区| 清苑县| 龙川县| 建阳市| 湟中县| 岳池县| 和林格尔县| 六枝特区| 扬州市| 遂宁市| 曲靖市|