On Sep 29, 2013, at 10:56 AM, pyArchInit ArcheoImagineers 
<pyarchi...@gmail.com> 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])))





Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to