On Tue, Aug 3, 2021 at 11:11 PM Lele Gaifax <l...@metapensiero.it> wrote:
>
> Larry Martell <larry.mart...@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:

print(type(filter_group[0]))

<class 'sqlalchemy.sql.elements.BinaryExpression'>

print(filter_group[0])

dbo."Portfolio"."companyCode" IN (:companyCode_1, :companyCode_2,
:companyCode_3)

Which then fails with:

sqlalchemy.orm.evaluator.UnevaluatableError: Cannot evaluate
clauselist with operator <function comma_op at 0x7f632f8f3dc0>

I am passing in:

     **{'query_params': {'companyCode': ['A', 'B', 'C']},
         'values': {'portfolioName': 'test'}}

Any ideas how to get past this?

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/CACwCsY78%2BKm%3DqagpVRCY9UNcLTqHAF4_3jX_HdSsL8F%2BFuYJCA%40mail.gmail.com.

Reply via email to