annotate pylearn/dbdict/api0.py @ 629:4e7781972999

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