bottle 0.5中的key-value数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import anydbm as dbm
import cPickle as pickle
 
class BottleBucket(object):
    '''Memory-caching wrapper around anydbm'''
    def __init__(self, name):
        self.__dict__['name'] = name
        self.__dict__['db'] = dbm.open('%s.db' % name, 'c')
        self.__dict__['mmap'] = {}
 
    def __getitem__(self, key):
        if key not in self.mmap:
            self.mmap[key] = pickle.loads(self.db[key])
        return self.mmap[key]
 
    def __setitem__(self, key, value):
        self.mmap[key] = value
 
    def __delitem__(self, key):
        if key in self.mmap:
            del self.mmap[key]
        del self.db[key]
 
    def __getattr__(self, key):
        try: return self[key]
        except KeyError: raise AttributeError(key)
 
    def __setattr__(self, key, value):
        self[key] = value
 
    def __delattr__(self, key):
        try: del self[key]
        except KeyError: raise AttributeError(key)
 
    def __iter__(self):
        return iter(self.ukeys())
 
    def __contains__(self, key):
        return key in self.ukeys()
 
    def __len__(self):
        return len(self.ukeys())
 
    def keys(self):
        return list(self.ukeys())
 
    def ukeys(self):
      return set(self.db.keys()) | set(self.mmap.keys())
 
    def save(self):
        self.close()
        self.__init__(self.name)
 
    def close(self):
        for key in self.mmap.keys():
            pvalue = pickle.dumps(self.mmap[key], pickle.HIGHEST_PROTOCOL)
            if key not in self.db or pvalue != self.db[key]:
                self.db[key] = pvalue
        self.mmap.clear()
        self.db.close()
 
    def clear(self):
        for key in self.db.keys():
            del self.db[key]
        self.mmap.clear()
 
    def update(self, other):
        self.mmap.update(other)
 
    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            if default:
                return default
            raise
 
bb = BottleBucket("testbucket") # 打开testbucket.db,读取其中内容。若testbucket.db不存在,则会创建一个。
print bb.a      # 读取其中的内容
print bb["b"]   # 另一种读取方式
bb.c = 999      # 更新(增加)内容
bb["d"]=666     # 另一种更新方式
bb.save()       # 将数据pickle后保存到testbucket.db中,数据类型支持Python对象。

 

posted @   鸪斑兔  阅读(168)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示