即使存在可以做到这一点的模块(请参见其他答案),我还是尝试编写了一个简单、自包含版本。以下是一个类KeyValueStore
(键和值都是字符串),它的工作方式如下:
演示
from sqlitekeyvaluestore import KeyValueStore
kv = KeyValueStore('test.db')
print(len(kv))
kv['hello1'] = 'you1'
kv['hello2'] = 'you2'
kv['hello3'] = 'you3'
print(kv['hello1'])
print(len(kv))
del kv['hello1']
print(len(kv))
print('hello1' in kv)
print('hello3' in kv)
kv['hello3'] = 'newvalue'
print(kv['hello3'])
print(kv.keys())
print(kv.values())
print(kv.items())
for k in kv:
print(k, kv[k])
kv.close()
代码:sqlitekeyvaluestore.py
import sqlite3
class KeyValueStore(dict):
def __init__(self, filename=None):
self.conn = sqlite3.connect(filename)
self.conn.execute("CREATE TABLE IF NOT EXISTS kv (key text unique, value text)")
def close(self):
self.conn.commit()
self.conn.close()
def __len__(self):
rows = self.conn.execute('SELECT COUNT(*) FROM kv').fetchone()[0]
return rows if rows is not None else 0
def iterkeys(self):
c = self.conn.cursor()
for row in c.execute('SELECT key FROM kv'):
yield row[0]
def itervalues(self):
c = self.conn.cursor()
for row in c.execute('SELECT value FROM kv'):
yield row[0]
def iteritems(self):
c = self.conn.cursor()
for row in c.execute('SELECT key, value FROM kv'):
yield row[0], row[1]
def keys(self):
return list(self.iterkeys())
def values(self):
return list(self.itervalues())
def items(self):
return list(self.iteritems())
def __contains__(self, key):
return self.conn.execute('SELECT 1 FROM kv WHERE key = ?', (key,)).fetchone() is not None
def __getitem__(self, key):
item = self.conn.execute('SELECT value FROM kv WHERE key = ?', (key,)).fetchone()
if item is None:
raise KeyError(key)
return item[0]
def __setitem__(self, key, value):
self.conn.execute('REPLACE INTO kv (key, value) VALUES (?,?)', (key, value))
def __delitem__(self, key):
if key not in self:
raise KeyError(key)
self.conn.execute('DELETE FROM kv WHERE key = ?', (key,))
def __iter__(self):
return self.iterkeys()