annotate pylearn/dbdict/api0.py @ 621:7041749cf804

untested changes to close sessions in api0
author James Bergstra <bergstrj@iro.umontreal.ca>
date Sun, 18 Jan 2009 21:14:14 -0500
parents fa6585609e01
children d2d582bcf7dc
rev   line source
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
1 from sqlalchemy import create_engine, desc
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
2 import sqlalchemy.pool
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
3 from sqlalchemy.orm import sessionmaker
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
4 from sqlalchemy import Table, Column, MetaData, ForeignKey
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
5 from sqlalchemy import Integer, String, Float, Boolean, DateTime, Text, Binary
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
6 from sqlalchemy.orm import mapper, relation, backref, eagerload
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
7 from sqlalchemy.sql import operators, select
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
8 from sql_commands import crazy_sql_command
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
9
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
10 class Todo(Exception): """Replace this with some working code!"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
11
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
12 class DbHandle (object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
13 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
14 This class also provides filtering shortcuts that hide the names of the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
15 DbHandle internal databases.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
16
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
17 Attributes:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
18 dict_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
19 pair_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
20 link_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
21
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
22
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
23
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
24 dict_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
25
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
26 An SqlAlchemy-mapped class corresponding to database table with the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
27 following schema:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
28
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
29 Column('id', Integer, primary_key=True)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
30 Column('create', DateTime)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
31 Column('write', DateTime)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
32 Column('read', DateTime)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
33
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
34 #TODO: reconsider create/read/write
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
35
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
36 pair_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
37
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
38 An SqlAlchemy-mapped class corresponding to database table with the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
39 following schema:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
40
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
41 Column('id', Integer, primary_key=True)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
42 Column('name', String(128))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
43 Column('ntype', Boolean)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
44 Column('fval', Double)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
45 Column('sval', Text))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
46 Column('bval', Blob)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
47
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
48 #TODO: Consider difference between text and binary
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
49 #TODO: Consider adding a 'type' column
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
50 #TODO: Consider union?
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
51 #TODO: Are there stanard ways of doing this kind of thing?
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
52
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
53 link_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
54
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
55 An SqlAlchemy-mapped class corresponding to database table with the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
56 following schema:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
57
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
58 Column('dict_id', Integer, ForeignKey('%s.id' % t_trial), primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
59 Column('keyval_id', Integer, ForeignKey('%s.id' % t_keyval), primary_key=True))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
60
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
61 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
62
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
63 e_bad_table = 'incompatible columns in table'
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
64
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
65 def __init__(h_self, Session, engine, dict_table, pair_table, link_table):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
66 h_self._engine = engine;
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
67 h_self._dict_table = dict_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
68 h_self._pair_table = pair_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
69 h_self._link_table = link_table
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
70
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
71 #TODO: replace this crude algorithm (ticket #17)
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
72 if ['id', 'create', 'write', 'read', 'status', 'priority'] != [c.name for c in dict_table.c]:
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
73 raise ValueError(h_self.e_bad_table, dict_table)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
74 if ['id', 'name', 'ntype', 'fval', 'sval', 'bval'] != [c.name for c in pair_table.c]:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
75 raise ValueError(h_self.e_bad_table, pair_table)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
76 if ['dict_id', 'pair_id'] != [c.name for c in link_table.c]:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
77 raise ValueError(h_self.e_bad_table, pair_table)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
78
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
79 h_self._session_fn = Session
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
80
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
81 class KeyVal (object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
82 """KeyVal interfaces between python types and the database.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
83
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
84 It encapsulates heuristics for type conversion.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
85 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
86 def __init__(k_self, name, val):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
87 k_self.name = name
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
88 k_self.val = val
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
89 def __repr__(k_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
90 return "<Param(%s,'%s', %s)>" % (k_self.id, k_self.name, repr(k_self.val))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
91 def __get_val(k_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
92 val = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
93 if k_self.fval is not None: val = [int, float][k_self.ntype](k_self.fval)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
94 if k_self.bval is not None: val = eval(str(k_self.bval))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
95 if k_self.sval is not None: val = k_self.sval
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
96 return val
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
97 def __set_val(k_self, val):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
98 if isinstance(val, (str,unicode)):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
99 k_self.fval = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
100 k_self.bval = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
101 k_self.sval = val
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
102 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
103 k_self.sval = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
104 try:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
105 f = float(val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
106 except (TypeError, ValueError):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
107 f = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
108 if f is None: #binary data
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
109 k_self.bval = repr(val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
110 assert eval(k_self.bval) == val
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
111 k_self.fval = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
112 k_self.ntype = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
113 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
114 k_self.bval = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
115 k_self.fval = f
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
116 k_self.ntype = isinstance(val,float)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
117 val = property(__get_val, __set_val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
118
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
119 mapper(KeyVal, pair_table)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
120
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
121 class Dict (object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
122 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
123 Instances are dict-like objects with additional features for
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
124 communicating with an active database.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
125
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
126 This class will be mapped by SqlAlchemy to the dict_table.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
127
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
128 Attributes:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
129 handle - reference to L{DbHandle} (creator)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
130
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
131 """
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
132 def __init__(d_self, session=None):
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
133 if session is None:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
134 s = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
135 s.add(d_self) #d_self transient -> pending
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
136 s.commit() #d_self -> persistent
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
137 s.close() #d_self -> detached
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
138 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
139 s = session
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
140 s.save(d_self)
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
141
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
142 _forbidden_keys = set(['session'])
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
143
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
144 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
145 # dictionary interface
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
146 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
147
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
148 def __contains__(d_self, key):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
149 for a in d_self._attrs:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
150 if a.name == key:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
151 return True
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
152 return False
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
153
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
154 def __eq__(self, other):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
155 return dict(self) == dict(other)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
156 def __neq__(self, other):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
157 return dict(self) != dict(other)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
158
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
159 def __getitem__(d_self, key):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
160 for a in d_self._attrs:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
161 if a.name == key:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
162 return a.val
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
163 raise KeyError(key)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
164
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
165 def __setitem__(d_self, key, val, session=None):
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
166 if session is None:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
167 s = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
168 s.add(d_self)
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
169 d_self._set_in_session(key, val, s)
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
170 s.commit()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
171 s.close()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
172 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
173 s = session
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
174 s.add(d_self)
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
175 d_self._set_in_session(key, val, s)
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
176
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
177 def __delitem__(d_self, key, session=None):
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
178 if session is None:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
179 s = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
180 commit_close = True
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
181 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
182 s = session
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
183 commit_close = False
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
184 s.add(d_self)
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
185
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
186 #find the item to delete in d_self._attrs
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
187 to_del = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
188 for i,a in enumerate(d_self._attrs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
189 if a.name == key:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
190 assert to_del is None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
191 to_del = (i,a)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
192 if to_del is None:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
193 raise KeyError(key)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
194 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
195 i, a = to_del
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
196 s.delete(a)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
197 del d_self._attrs[i]
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
198 if commit_close:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
199 s.commit()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
200 #s.add(d_self) #why is this here? maybe it should go earlier??
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
201 s.close()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
202 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
203 pass
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
204
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 538
diff changeset
205 def iteritems(d_self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 538
diff changeset
206 return d_self.items()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 538
diff changeset
207
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
208 def items(d_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
209 return [(kv.name, kv.val) for kv in d_self._attrs]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
210
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
211 def keys(d_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
212 return [kv.name for kv in d_self._attrs]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
213
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
214 def values(d_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
215 return [kv.val for kv in d_self._attrs]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
216
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
217 def update(d_self, dct, session=None, **kwargs):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
218 """Like dict.update(), set keys from kwargs"""
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
219 if session is None:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
220 s = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
221 commit_close = True
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
222 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
223 s = session
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
224 commit_close = False
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
225 for k, v in dct.items():
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
226 d_self._set_in_session(k, v, s)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
227 for k, v in kwargs.items():
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
228 d_self._set_in_session(k, v, s)
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
229
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
230 if commit_close:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
231 s.commit()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
232 s.close()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
233 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
234 s.add(d_self) #why is this here? maybe it should go earlier??
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
235
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
236 def get(d_self, key, default):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
237 try:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
238 return d_self[key]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
239 except KeyError:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
240 return default
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
241
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 568
diff changeset
242 def __str__(self):
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 568
diff changeset
243 return 'Dict'+ str(dict(self))
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 568
diff changeset
244
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
245 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
246 # database stuff
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
247 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
248
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
249 def refresh(d_self, session=None):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
250 """Sync key-value pairs from database to self
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
251
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
252 @param session: use the given session, and do not commit.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
253
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
254 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
255 if session is None:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
256 session = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
257 session.add(d_self) #so session knows about us
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
258 session.refresh(d_self)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
259 session.commit()
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
260 session.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
261 else:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
262 session.add(d_self) #so session knows about us
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
263 session.refresh(self.dbrow)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
264
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
265 def delete(d_self, session=None):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
266 """Delete this dictionary from the database
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
267
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
268 @param session: use the given session, and do not commit.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
269 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
270 if session is None:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
271 session = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
272 session.add(d_self) #so session knows about us
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
273 session.delete(d_self) #mark for deletion
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
274 session.commit()
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
275 session.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
276 else:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
277 session.add(d_self) #so session knows about us
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
278 session.delete(d_self)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
279
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
280 # helper routine by update() and __setitem__
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
281 def _set_in_session(d_self, key, val, session):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
282 """Modify an existing key or create a key to hold val"""
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
283 #FIRST SOME MIRRORING HACKS
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
284 if key == 'dbdict.status':
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
285 ival = int(val)
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
286 d_self.status = ival
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
287 if key == 'dbdict.priority':
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
288 fval = float(val)
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
289 d_self.priority = fval
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
290
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
291 if key in d_self._forbidden_keys:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
292 raise KeyError(key)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
293 created = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
294 for i,a in enumerate(d_self._attrs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
295 if a.name == key:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
296 assert created == None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
297 created = h_self._KeyVal(key, val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
298 d_self._attrs[i] = created
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
299 if not created:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
300 created = h_self._KeyVal(key, val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
301 d_self._attrs.append(created)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
302 session.save(created)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
303
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
304 mapper(Dict, dict_table,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
305 properties = {
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
306 '_attrs': relation(KeyVal,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
307 secondary=link_table,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
308 cascade="all, delete-orphan")
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
309 })
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
310
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
311 class _Query (object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
312 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
313 Attributes:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
314 _query - SqlAlchemy.Query object
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
315 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
316
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
317 def __init__(q_self, query):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
318 q_self._query = query
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
319
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
320 def __iter__(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
321 return q_self.all().__iter__()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
322
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
323 def __getitem__(q_self, item):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
324 return q_self._query.__getitem__(item)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
325
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
326 def filter_eq(q_self, kw, arg):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
327 """Return a Query object that restricts to dictionaries containing
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
328 the given kwargs"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
329
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
330 #Note: when we add new types to the key columns, add them here
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
331 q = q_self._query
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
332 T = h_self._Dict
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
333 if isinstance(arg, (str,unicode)):
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
334 q = q.filter(T._attrs.any(name=kw, sval=arg))
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
335 else:
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
336 try:
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
337 f = float(arg)
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
338 except (TypeError, ValueError):
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
339 f = None
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
340 if f is None:
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
341 q = q.filter(T._attrs.any(name=kw, bval=repr(arg)))
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
342 else:
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
343 q = q.filter(T._attrs.any(name=kw, fval=f))
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
344
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
345 return h_self._Query(q)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
346
619
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
347 def filter_eq_dct(q_self, dct):
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
348 rval = q_self
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
349 for key, val in dct.items():
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
350 rval = rval.filter_eq(key,val)
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
351 return rval
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
352
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
353 def all(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
354 """Return an iterator over all matching dictionaries.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
355
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
356 See L{SqlAlchemy.Query}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
357 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
358 return q_self._query.all()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
359
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
360 def count(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
361 """Return the number of matching dictionaries.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
362
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
363 See L{SqlAlchemy.Query}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
364 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
365 return q_self._query.count()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
366
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
367 def first(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
368 """Return some matching dictionary, or None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
369 See L{SqlAlchemy.Query}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
370 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
371 return q_self._query.first()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
372
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
373 def all_ordered_by(q_self, key, desc=False):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
374 """Return query results, sorted.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
375
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
376 @type key: string or tuple of string or list of string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
377 @param: keys by which to sort the results.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
378
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
379 @rtype: list of L{DbHandle._Dict} instances
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
380 @return: query results, sorted by given keys
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
381 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
382
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
383 # order_by is not easy to do in SQL based on the data structures we're
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
384 # using. Considering we support different data types, it may not be
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
385 # possible at all.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
386 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
387 # It would be easy if 'pivot' or 'crosstab' were provided as part of the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
388 # underlying API, but they are not. For example, read this:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
389 # http://www.simple-talk.com/sql/t-sql-programming/creating-cross-tab-queries-and-pivot-tables-in-sql/
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
390
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
391 # load query results
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
392 results = list(q_self.all())
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
393
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
394 if isinstance(key, (tuple, list)):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
395 val_results = [([d[k] for k in key], d) for d in results]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
396 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
397 val_results = [(d[key], d) for d in results]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
398
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
399 val_results.sort() #interesting: there is an optional key parameter
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
400 if desc:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
401 val_results.reverse()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
402 return [vr[-1] for vr in val_results]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
403
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
404 h_self._KeyVal = KeyVal
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
405 h_self._Dict = Dict
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
406 h_self._Query = _Query
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
407
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
408 def __iter__(h_self):
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
409 return h_self.query.__iter__()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
410
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
411 def insert_kwargs(h_self, **dct):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
412 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
413 @rtype: DbHandle with reference to self
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
414 @return: a DbHandle initialized as a copy of dct
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
415
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
416 @type dct: dict-like instance whose keys are strings, and values are
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
417 either strings, integers, floats
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
418
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
419 @param dct: dictionary to insert
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
420
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
421 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
422 rval = h_self._Dict()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
423 if dct: rval.update(dct)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
424 return rval
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
425 def insert(h_self, dct):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
426 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
427 @rtype: DbHandle with reference to self
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
428 @return: a DbHandle initialized as a copy of dct
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
429
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
430 @type dct: dict-like instance whose keys are strings, and values are
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
431 either strings, integers, floats
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
432
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
433 @param dct: dictionary to insert
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
434
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
435 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
436 rval = h_self._Dict()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
437 if dct: rval.update(dct)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
438 return rval
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
439
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
440 def query(h_self, session):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
441 """Construct an SqlAlchemy query, which can be subsequently filtered
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
442 using the instance methods of DbQuery"""
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
443 return h_self._Query(session.query(h_self._Dict)\
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
444 .options(eagerload('_attrs')))
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
445
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
446 def createView(h_self, view):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
447
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
448 s = h_self.session()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
449 cols = []
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
450
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
451 for col in view.columns:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
452 if col.name is "id":
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
453 continue;
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
454 elif isinstance(col.type, (Integer,Float)):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
455 cols.append([col.name,'fval']);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
456 elif isinstance(col.type,String):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
457 cols.append([col.name,'sval']);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
458 elif isinstance(col.type,Binary):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
459 cols.append([col.name,'bval']);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
460 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
461 assert "Error: wrong column type in view",view.name;
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
462
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
463 # generate raw sql command string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
464 viewsql = crazy_sql_command(view.name, cols, \
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
465 h_self._pair_table.name, \
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
466 h_self._link_table.name);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
467
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
468 #print 'Creating sql view with command:\n', viewsql;
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
469
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
470 h_self._engine.execute(viewsql);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
471 s.commit();
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
472 s.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
473
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
474 class MappedClass(object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
475 pass
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
476
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
477 mapper(MappedClass, view)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
478
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
479 return MappedClass
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
480
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
481 def session(h_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
482 return h_self._session_fn()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
483
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
484
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
485 def db_from_engine(engine,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
486 table_prefix='DbHandle_default_',
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
487 trial_suffix='trial',
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
488 keyval_suffix='keyval',
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
489 link_suffix='link'):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
490 """Create a DbHandle instance
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
491
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
492 @type engine: sqlalchemy engine (e.g. from create_engine)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
493 @param engine: connect to this database for transactions
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
494
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
495 @type table_prefix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
496 @type trial_suffix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
497 @type keyval_suffix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
498 @type link_suffix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
499
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
500 @rtype: DbHandle instance
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
501
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
502 @note: The returned DbHandle will use three tables to implement the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
503 many-to-many pattern that it needs:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
504 - I{table_prefix + trial_suffix},
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
505 - I{table_prefix + keyval_suffix}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
506 - I{table_prefix + link_suffix}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
507
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
508 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
509 Session = sessionmaker(autoflush=True, autocommit=False)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
510
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
511 metadata = MetaData()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
512
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
513 t_trial = Table(table_prefix+trial_suffix, metadata,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
514 Column('id', Integer, primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
515 Column('create', DateTime),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
516 Column('write', DateTime),
615
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
517 Column('read', DateTime),
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
518 Column('status', Integer),
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
519 Column('priority', Float(53))
a88ead1a1537 updated query to support new dot syntax, and hacked api0 to mirror dbdict.status and dbdict.priority to true columns
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 589
diff changeset
520 )
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
521
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
522 t_keyval = Table(table_prefix+keyval_suffix, metadata,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
523 Column('id', Integer, primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
524 Column('name', String(128), nullable=False), #name of attribute
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
525 Column('ntype', Boolean),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
526 Column('fval', Float(53)),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
527 Column('sval', Text),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
528 Column('bval', Binary))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
529
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
530 t_link = Table(table_prefix+link_suffix, metadata,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
531 Column('dict_id', Integer, ForeignKey('%s.id' % t_trial),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
532 primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
533 Column('pair_id', Integer, ForeignKey('%s.id' % t_keyval),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
534 primary_key=True))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
535
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
536 metadata.bind = engine
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
537 metadata.create_all() # no-op when tables already exist
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
538 #warning: tables can exist, but have incorrect schema
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
539 # see bug mentioned in DbHandle constructor
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
540
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
541 return DbHandle(Session, engine, t_trial, t_keyval, t_link)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
542
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
543 def sqlite_memory_db(echo=False, **kwargs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
544 """Return a DbHandle backed by a memory-based database"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
545 engine = create_engine('sqlite:///:memory:', echo=False)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
546 return db_from_engine(engine, **kwargs)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
547
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
548 def sqlite_file_db(filename, echo=False, **kwargs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
549 """Return a DbHandle backed by a file-based database"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
550 engine = create_engine('sqlite:///%s' % filename, echo=False)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
551 return db_from_engine(engine, **kwargs)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
552
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
553 def postgres_db(user, password, host, database, echo=False, poolclass=sqlalchemy.pool.NullPool, **kwargs):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
554 """Create an engine to access a postgres_dbhandle
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
555 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
556 db_str ='postgres://%(user)s:%(password)s@%(host)s/%(database)s' % locals()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
557
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
558 engine = create_engine(db_str, pool_size=pool_size, echo=echo, poolclass=poolclass)
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
559
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
560 return db_from_engine(engine, **kwargs)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
561