fix sql filtering on list values
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Sat, 17 Nov 2012 01:02:28 +0000 (20:02 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Sat, 17 Nov 2012 01:02:28 +0000 (20:02 -0500)
PLC/Storage/AlchemyObject.py

index 4ddcba6..d99a227 100644 (file)
@@ -81,5 +81,17 @@ class AlchemyObj(Record):
     def select(self, filter={}):
         class Cls(object): pass
         table = self.get_table()
-        clsmapper = mapper(Cls, table) 
-        return dbsession.query(clsmapper).filter_by(**filter) 
+        clsmapper = mapper(Cls, table)
+        # the easiest thing to do is pass the filter dict to the filter_by() method
+        # but filter_by doesn't support list values, so we will use filter() instead.
+        constraints = []
+        for (field, value) in filter.items():
+            if isinstance(value, list):
+                if value:
+                    constraints.append(table.columns.get(field).in_(value))
+            else:
+                constraints.append(table.columns.get(field) == value)
+        if not constraints:
+            return dbsession.query(clsmapper)
+        else:
+            return dbsession.query(clsmapper).filter(*constraints)