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])))
signature.asc
Description: Message signed with OpenPGP using GPGMail