def _where_clause(self, table, map, values): cl = ClauseList(operator=operators.and_) for key, val in values.iteritems(): if key not in map.keys(): continue if val is None: continue col = map[key] if IRelation.providedBy(col): if isinstance(val, dict): # read related object included in the query try: o = self.pickup(col.cls, **val) assert len(o) == 1 # sanity check val = o[0]._id except IndexError: raise DbError('A related object could not be ' + \ 'located in the database. %s: %s' % \ (col.cls, str(val))) elif isinstance(val, col.cls): # related object was included, use it's id val = val._id elif val == DB_NULL: val = None elif val: raise DbError("Invalid value for key '%s': %s" % \ (str(col.name), str(val))) col = col.name cl.append(table.c[col] == val) return cl
def get(self): w = ClauseList() for k in self.keyargs.keys(): w.append(self.table.c[k] == self.keyargs[k]) try: q = select([self.table.c[self.attr_name]], w) res = self.db_storage.db.execute(q).fetchall() assert len(res) <= 1 # sanity check return res[0][self.attr_name] except IndexError: raise DbError('An error occurred while getting related object ' + \ 'data "%s": %s' % (self.attr_name, self.keyargs))