annotate pylearn/dbdict/api0.py @ 628:739720896d61

added get by id to api0
author James Bergstra <bergstrj@iro.umontreal.ca>
date Mon, 19 Jan 2009 18:34:13 -0500
parents 25d9f91f1afa
children 4e7781972999
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.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
201
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 538
diff changeset
202 def iteritems(d_self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 538
diff changeset
203 return d_self.items()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 538
diff changeset
204
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
205 def items(d_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
206 return [(kv.name, kv.val) for kv in d_self._attrs]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
207
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
208 def keys(d_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
209 return [kv.name 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 values(d_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
212 return [kv.val for kv in d_self._attrs]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
213
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
214 def update(d_self, dct, session=None, **kwargs):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
215 """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
216 if session is None:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
217 s = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
218 commit_close = True
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
219 else:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
220 s = session
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
221 commit_close = False
624
25d9f91f1afa fixing session management in db dict update
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 623
diff changeset
222 s.add(d_self)
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
223 for k, v in dct.items():
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
224 d_self._set_in_session(k, v, s)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
225 for k, v in kwargs.items():
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
226 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
227
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
228 if commit_close:
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
229 s.commit()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
230 s.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
231
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
232 def get(d_self, key, default):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
233 try:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
234 return d_self[key]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
235 except KeyError:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
236 return default
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
237
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 568
diff changeset
238 def __str__(self):
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 568
diff changeset
239 return 'Dict'+ str(dict(self))
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 568
diff changeset
240
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
241 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
242 # database stuff
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
243 #
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
244
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
245 def refresh(d_self, session=None):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
246 """Sync key-value pairs from database to self
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 @param session: use the given session, and do not commit.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
249
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
250 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
251 if session is None:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
252 session = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
253 session.add(d_self) #so session knows about us
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
254 session.refresh(d_self)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
255 session.commit()
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
256 session.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
257 else:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
258 session.add(d_self) #so session knows about us
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
259 session.refresh(self.dbrow)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
260
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
261 def delete(d_self, session=None):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
262 """Delete this dictionary from the database
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
263
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
264 @param session: use the given session, and do not commit.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
265 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
266 if session is None:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
267 session = h_self._session_fn()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
268 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
269 session.delete(d_self) #mark for deletion
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
270 session.commit()
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
271 session.close()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
272 else:
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
273 session.add(d_self) #so session knows about us
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
274 session.delete(d_self)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
275
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
276 # helper routine by update() and __setitem__
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
277 def _set_in_session(d_self, key, val, session):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
278 """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
279 #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
280 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
281 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
282 d_self.status = ival
624
25d9f91f1afa fixing session management in db dict update
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 623
diff changeset
283 if key == 'dbdict.sql.priority':
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
284 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
285 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
286
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
287 if key in d_self._forbidden_keys:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
288 raise KeyError(key)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
289 created = None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
290 for i,a in enumerate(d_self._attrs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
291 if a.name == key:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
292 assert created == None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
293 created = h_self._KeyVal(key, val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
294 d_self._attrs[i] = created
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
295 if not created:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
296 created = h_self._KeyVal(key, val)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
297 d_self._attrs.append(created)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
298 session.save(created)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
299
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
300 mapper(Dict, dict_table,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
301 properties = {
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
302 '_attrs': relation(KeyVal,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
303 secondary=link_table,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
304 cascade="all, delete-orphan")
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
305 })
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
306
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
307 class _Query (object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
308 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
309 Attributes:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
310 _query - SqlAlchemy.Query object
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
311 """
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 def __init__(q_self, query):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
314 q_self._query = query
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 def __iter__(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
317 return q_self.all().__iter__()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
318
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
319 def __getitem__(q_self, item):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
320 return q_self._query.__getitem__(item)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
321
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
322 def filter_eq(q_self, kw, arg):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
323 """Return a Query object that restricts to dictionaries containing
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
324 the given kwargs"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
325
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
326 #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
327 q = q_self._query
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
328 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
329 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
330 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
331 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
332 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
333 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
334 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
335 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
336 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
337 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
338 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
339 q = q.filter(T._attrs.any(name=kw, fval=f))
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
340
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
341 return h_self._Query(q)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
342
619
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
343 def filter_eq_dct(q_self, dct):
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
344 rval = q_self
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
345 for key, val in dct.items():
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
346 rval = rval.filter_eq(key,val)
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
347 return rval
fa6585609e01 added api0.filter_eq_dct
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 615
diff changeset
348
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
349 def all(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
350 """Return an iterator over all matching dictionaries.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
351
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
352 See L{SqlAlchemy.Query}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
353 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
354 return q_self._query.all()
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 def count(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
357 """Return the number of matching dictionaries.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
358
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
359 See L{SqlAlchemy.Query}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
360 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
361 return q_self._query.count()
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 def first(q_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
364 """Return some matching dictionary, or None
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
365 See L{SqlAlchemy.Query}
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 return q_self._query.first()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
368
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
369 def all_ordered_by(q_self, key, desc=False):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
370 """Return query results, sorted.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
371
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
372 @type key: string or tuple of string or list of string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
373 @param: keys by which to sort the results.
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
374
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
375 @rtype: list of L{DbHandle._Dict} instances
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
376 @return: query results, sorted by given keys
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
377 """
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 # 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
380 # using. Considering we support different data types, it may not be
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
381 # possible at all.
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 # 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
384 # underlying API, but they are not. For example, read this:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
385 # 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
386
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
387 # load query results
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
388 results = list(q_self.all())
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
389
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
390 if isinstance(key, (tuple, list)):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
391 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
392 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
393 val_results = [(d[key], d) for d in results]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
394
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
395 val_results.sort() #interesting: there is an optional key parameter
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
396 if desc:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
397 val_results.reverse()
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
398 return [vr[-1] for vr in val_results]
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
399
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
400 h_self._KeyVal = KeyVal
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
401 h_self._Dict = Dict
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
402 h_self._Query = _Query
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 def __iter__(h_self):
623
ae954c27fd11 looping works, eagerload of booked jobs works by str() HACK
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 622
diff changeset
405 s = h_self.session()
ae954c27fd11 looping works, eagerload of booked jobs works by str() HACK
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 622
diff changeset
406 rval = list(h_self.query(s).__iter__())
ae954c27fd11 looping works, eagerload of booked jobs works by str() HACK
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 622
diff changeset
407 s.close()
ae954c27fd11 looping works, eagerload of booked jobs works by str() HACK
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 622
diff changeset
408 return rval.__iter__()
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
409
622
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
410 def insert_kwargs(h_self, session=None, **dct):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
411 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
412 @rtype: DbHandle with reference to self
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
413 @return: a DbHandle initialized as a copy of dct
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
414
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
415 @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
416 either strings, integers, floats
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
417
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
418 @param dct: dictionary to insert
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
419
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
420 """
622
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
421 return h_self.insert(dct, session=session)
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
422
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
423 def insert(h_self, dct, session=None):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
424 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
425 @rtype: DbHandle with reference to self
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
426 @return: a DbHandle initialized as a copy of dct
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
427
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
428 @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
429 either strings, integers, floats
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
430
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
431 @param dct: dictionary to insert
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 """
622
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
434 if session is None:
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
435 s = h_self.session()
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
436 rval = h_self._Dict(s)
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
437 if dct: rval.update(dct, session=s)
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
438 s.commit()
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
439 s.close()
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
440 else:
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
441 rval = h_self._Dict(session)
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
442 if dct: rval.update(dct, session=session)
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
443 return rval
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
444
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
445 def query(h_self, session):
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
446 """Construct an SqlAlchemy query, which can be subsequently filtered
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
447 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
448 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
449 .options(eagerload('_attrs')))
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 def createView(h_self, view):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
452
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
453 s = h_self.session()
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
454 cols = []
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
455
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
456 for col in view.columns:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
457 if col.name is "id":
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
458 continue;
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
459 elif isinstance(col.type, (Integer,Float)):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
460 cols.append([col.name,'fval']);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
461 elif isinstance(col.type,String):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
462 cols.append([col.name,'sval']);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
463 elif isinstance(col.type,Binary):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
464 cols.append([col.name,'bval']);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
465 else:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
466 assert "Error: wrong column type in view",view.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 # generate raw sql command string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
469 viewsql = crazy_sql_command(view.name, cols, \
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
470 h_self._pair_table.name, \
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
471 h_self._link_table.name);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
472
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
473 #print 'Creating sql view with command:\n', viewsql;
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
474
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
475 h_self._engine.execute(viewsql);
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
476 s.commit();
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
477 s.close()
538
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 class MappedClass(object):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
480 pass
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
481
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
482 mapper(MappedClass, view)
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 return MappedClass
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
485
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
486 def session(h_self):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
487 return h_self._session_fn()
628
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
488
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
489 def get(h_self, id):
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
490 s = h_self.session()
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
491 rval = s.query(h_self._Dict).get(id)
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
492 if rval:
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
493 #eagerload hack
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
494 str(rval)
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
495 rval.id
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
496 s.close()
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
497 return rval
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
498
739720896d61 added get by id to api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 624
diff changeset
499
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
500
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 def db_from_engine(engine,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
503 table_prefix='DbHandle_default_',
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
504 trial_suffix='trial',
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
505 keyval_suffix='keyval',
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
506 link_suffix='link'):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
507 """Create a DbHandle instance
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 @type engine: sqlalchemy engine (e.g. from create_engine)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
510 @param engine: connect to this database for transactions
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
511
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
512 @type table_prefix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
513 @type trial_suffix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
514 @type keyval_suffix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
515 @type link_suffix: string
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
516
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
517 @rtype: DbHandle instance
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
518
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
519 @note: The returned DbHandle will use three tables to implement the
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
520 many-to-many pattern that it needs:
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
521 - I{table_prefix + trial_suffix},
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
522 - I{table_prefix + keyval_suffix}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
523 - I{table_prefix + link_suffix}
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
524
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
525 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
526 Session = sessionmaker(autoflush=True, autocommit=False)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
527
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
528 metadata = MetaData()
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_trial = Table(table_prefix+trial_suffix, metadata,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
531 Column('id', Integer, primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
532 Column('create', DateTime),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
533 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
534 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
535 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
536 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
537 )
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
539 t_keyval = Table(table_prefix+keyval_suffix, metadata,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
540 Column('id', Integer, primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
541 Column('name', String(128), nullable=False), #name of attribute
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
542 Column('ntype', Boolean),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
543 Column('fval', Float(53)),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
544 Column('sval', Text),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
545 Column('bval', Binary))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
546
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
547 t_link = Table(table_prefix+link_suffix, metadata,
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
548 Column('dict_id', Integer, ForeignKey('%s.id' % t_trial),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
549 primary_key=True),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
550 Column('pair_id', Integer, ForeignKey('%s.id' % t_keyval),
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
551 primary_key=True))
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
552
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
553 metadata.bind = engine
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
554 metadata.create_all() # no-op when tables already exist
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
555 #warning: tables can exist, but have incorrect schema
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
556 # see bug mentioned in DbHandle constructor
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
557
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
558 return DbHandle(Session, engine, t_trial, t_keyval, t_link)
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 def sqlite_memory_db(echo=False, **kwargs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
561 """Return a DbHandle backed by a memory-based database"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
562 engine = create_engine('sqlite:///:memory:', echo=False)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
563 return db_from_engine(engine, **kwargs)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
564
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
565 def sqlite_file_db(filename, echo=False, **kwargs):
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
566 """Return a DbHandle backed by a file-based database"""
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
567 engine = create_engine('sqlite:///%s' % filename, echo=False)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
568 return db_from_engine(engine, **kwargs)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
569
621
7041749cf804 untested changes to close sessions in api0
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 619
diff changeset
570 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
571 """Create an engine to access a postgres_dbhandle
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
572 """
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
573 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
574
622
d2d582bcf7dc api0 and sql seem to work with session closing
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 621
diff changeset
575 engine = create_engine(db_str, echo=echo, poolclass=poolclass)
538
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
576
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
577 return db_from_engine(engine, **kwargs)
798607a058bd added missing files
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
578