On Tue, Aug 3, 2021 at 11:11 PM Lele Gaifax <
le...@metapensiero.it> wrote:
>
> Larry Martell <
larry....@gmail.com> writes:
>
> > I am trying to write a function that takes kwargs as a param and
> > generates an update statement where the rows to be updated are
> > specified in an in clause.
> >
> > Something like this:
> >
> > def update_by_in(self, **kwargs):
> > filter_group = []
> > for col in kwargs['query_params']:
> > # obviously this line does not work as col is a string,
> > but this is the intent
> > filter_group.append(col.in_(tuple(kwargs['query_params'][col])))
> >
> > self._session.query(self.model_class).filter(*filter_group).update(kwargs['values'])
> >
> > self.update_by_in(
> > **{'query_params': {'companyCode': ['A', 'B', 'C']},
> > 'values': {'portfolioName': 'test'}}
> > )
> >
> > Is there a way to do this?
>
> Sure, and easy enough: replace the line where you append to `filter_group`
> with something like
>
> attr = getattr(self.model_class, col)
> filter_group.append(attr.in_(tuple(kwargs['query_params'][col])))
>
> that is, obtain the mapped class member named after "col", and use that to
> build the filter expression.
Thanks for the reply. When I do that, filter group ends up like: