annotate schema/sql.py @ 0:f7edadebb1de

initial commit
author Jeff Hammel <jhammel@mozilla.com>
date Fri, 17 Feb 2012 12:20:51 -0800
parents
children 5baa23a8d32f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 import sqlite3
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2 import sys
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 import tempfile
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 class SQL(object):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 converters = {int: 'INT',
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 str: 'TEXT',
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 unicode: 'TEXT'}
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 def __init__(self, database=None):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 self.database = database or tempfile.mktemp()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13 def __call__(self, statement, *parameters):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 con = None
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15 e = None
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
16 try:
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 con = sqlite3.connect(self.database)
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 cursor = con.cursor()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19 cursor.execute(statement, *parameters)
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 data = cursor.fetchall()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21 con.commit()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
22 except sqlite3.Error, e:
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23 print >> sys.stderr, "Error %s:" % e.args[0]
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 if con:
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25 con.rollback()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
26 raise
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27 if con:
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
28 con.close()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
29 if e:
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
30 raise
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
31 return data
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
32
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
33 def update(self, table, **where):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34 pass
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36 def select(self, table, id, **where):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37 if id is None:
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 id = '*'
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39 return self("SELECT ? FROM ? WHERE %s" % 'AND '.join(['%s=%s' % (i, repr(j)) for i, j in where.items()]))
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 def tables(self):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 """return the tables available in the db"""
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 # XXX sqlite specific
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 return set([i[0] for i in self("SELECT name FROM sqlite_master WHERE type='table'")])
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 def create(self, name, *values):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 """
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48 create a new table
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 - name: name of the table
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 - values: 2-tuples of (column name, type)
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
51 """
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 # sanity checks
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53 assert not [i for i in values if len(i) != 2], "Values should be 2-tuples"
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 missing = set([i[1] for i in values]).difference(self.converters.keys())
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 assert not missing, "Unknown types found: %s" % missing
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 self("DROP TABLE IF EXISTS %s" % name)
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 self("CREATE TABLE %s (%s)" % (name, ', '.join(["%s %s" % (i, self.converters[j]) for i, j in values])))
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 def columns(self, table):
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 """
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 return the column names in a table
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 """
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 info = self("PRAGMA table_info(%s)" % table)
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66 return [i[1] for i in info]
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 if __name__ == '__main__':
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69 db = SQL()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 # there should be no tables
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 assert not db.tables()
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 # add a table
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 db.create('foo', ('bar', int), ('blarg', str))
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 db.create('fleem', ('baz', int))
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 assert db.tables() == set(['foo', 'fleem'])
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78 columns = db.columns('foo')
f7edadebb1de initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 assert columns == ['bar', 'blarg']