On Sep 29, 2013, at 10:56 AM, pyArchInit ArcheoImagineers <[email protected]> wrote:
> Hi to all.
> I try to use the code in this way (query LIKE with OR operator)
>
> res =
> session.query(MAPPER).filter(or_(MAPPER.field.contains('Value1'),MAPPER.field.contains('Value2'),
> MAPPER.field.contains('Value3'),MAPPER.field.contains('Value4')))
>
> With a small dataset, I found the records I want, but with a larger dataset
> sqlalchemy return me an error:
>
> more than 255 arguments.
>
> To bypass this problem in the past I used the operator in_ in this way:
>
> id_list = [1, 2, 3]
>
> session.query(CLASS).filter(CLASS.field.in_(id_list)).all()
>
> I've guessed that was possible to make something like this:
>
> value_to_find = [CLASS.field.contains('value1'),
> CLASS.field.contains('value2')]
>
> session.query(CLASS).filter(CLASS.field.in_(value_to_find)).all()
>
> This script runs without error, but didn't return me any result.
>
> Because is a OR type query, it's a good idea make single research for each
> value and storing the id of every record in a list?
>
> Smothing like this:
>
> res_list = []
> for value in value_list:
> res = session.query(MAPPER).filter(MAPPER.field.contains(value))
> for r in res:
> res_list.append(res.id_record)
I'd batch them (also if you only need "id_record", query for that specifically):
res_list = []
while value_list:
chunk = value_list[0:100]
value_list = value_list[100:]
res_list.extend(id_rec for id_rec, in
session.query(M.id_record).filter(or_(*[M.field.contains(v) for v in chunk])))
signature.asc
Description: Message signed with OpenPGP using GPGMail
