summaryrefslogtreecommitdiff
path: root/README.mdwn
blob: 6d127feac80b954709bd11ff88d4de4ba648c682 (plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
withsqlite - uses an sqlite db as a back end for a dict-like object,
kind of like shelve but with json and sqlite3.

Copyright 2011-2013 James Vasile
Released under the GNU General Public License, version 3 or later.
See https://www.gnu.org/licenses/gpl-3.0.html for terms.

Repo is at <http://github.com/jvasile/withsqlite>.  Patches welcome!

This file was developed as part of planeteria <http://github.com/jvasile/planeteria>


Backends a dict on an sqlite db.  This class aims to present like a
dict wherever it can.

USE:
import sqlite_db from withsqlite
with sqlite_db("filename") as db:
   db['aaa'] = {'test':'ok'}
   print db.items()

Specify a table to have one sqlite db hold multiple dicts:

with sqlite_db("filename", table="fruit") as db:
   db['citrus'] = ['orange', 'grapefruit']
   print db.items()

If you change the dict in any way, its state will differ from the
state of the sqlite database.  Changes are committed to disk when you
close the database connection, manually call commit, or (if you've set
autocommit to True) after each assignment.

BUGS:

vals are json serialized before being written, so if you can't
serialize it, you can't put it in the dict.

Unimplemented mapping API: 
a.copy() 	a (shallow) copy of a 	
a.update([b]) 	updates a with key/value pairs from b, overwriting existing keys, returns None 
a.fromkeys(seq[, value]) 	Creates a new dictionary with keys from seq and values set to value 
a.setdefault(k[, x]) 	a[k] if k in a, else x (also setting it)
a.pop(k[, x]) 	a[k] if k in a, else x (and remove k)
a.popitem() 	remove and return an arbitrary (key, value) pair 
a.iteritems() 	return an iterator over (key, value) pairs
a.iterkeys() 	return an iterator over the mapping's keys
a.itervalues() 	return an iterator over the mapping's values

TODO: implement that mapping API

   >>> with sqlite_db("test") as db:
   ...    db.clear()
   ...    db.items()
   ... 
   []
   >>> with sqlite_db("test") as db:
   ...    db['a']="test"
   ...    db.items()
   ... 
   [(u'a', u'test')]
   >>> with sqlite_db("test") as db:
   ...    db['as']="test"
   ...    db.items()
   ... 
   [(u'a', u'test'), (u'as', u'test')]
   >>> with sqlite_db("test") as db:
   ...    db['b']=[1,2,3,4,5]
   ...    del db['b']
   ... 
   >>> with sqlite_db("test") as db:
   ...    db.items()
   ...    len(db)
   ... 
   [(u'a', u'test'), (u'as', u'test')]
   2
   >>> with sqlite_db("test") as db:
   ...    db.keys()
   ... 
   [u'a', u'as']
   >>> with sqlite_db("test") as db:
   ...    db.values()
   ... 
   [u'test', u'test']
   >>> with sqlite_db("test") as db:
   ...    db.get('b',5)
   ... 
   5
   >>> with sqlite_db("test") as db:
   ...    db.get('b')
   ... 
   >>> with sqlite_db("test") as db:
   ...    db.get('c',5)
   ... 
   5
   >>> with sqlite_db("test") as db:
   ...    'as' in db
   ... 
   True
   >>> with sqlite_db("test") as db:
   ...    'asdf' not in db
   ... 
   True
   >>> with sqlite_db("test") as db:
   ...    db.has_key('as')
   ...
   True
   >>>