2016-01-14 2 views
1

У меня есть 2 таблицы users и users_address, и я пытаюсь получить всех пользователей с неполным именем или адресом.Фильтр REGEX в SQLalchemy

Все работает хорошо, за исключением фильтра, связанные с почтовой маршрутизации, где искать образец:

(некоторые цифры) + (пробел) + (некоторые буквы или пробелы)

Вот мой код:

ua = aliased(UserAddress) 

    # Main query, incomplete users or addresses 
    query1 = DBSession.query(
     User.id, 
     User.member_id, 
     User.lastname, 
     User.firstname, 
     ua.supplemental_address_1, 
     ua.supplemental_address_2, 
     ua.supplemental_address_3, 
     ua.street_address, 
     ua.postal_routing, 
     ua.country, 
    ).distinct() 

    query1 = query1.join(ua, User.addresses) 

    query1 = query1.filter(
     sa.or_(
      User.lastname == u'', 
      User.firstname == u'', 
      sa.and_(
       ua.primary == True, 
       sa.or_(
        ua.country == u'', 
        sa.and_(
         ua.supplemental_address_1 == u'', 
         ua.supplemental_address_2 == u'', 
         ua.supplemental_address_3 == u'', 
         ua.street_address == u'', 
        ), 
        ~ua.postal_routing.op('regexp')('\d*\ ?(\w\s)*'), 
       ) 
      ) 
     ) 
    ) 

Но я получил эту ошибку:

ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near "regexp" LINE 4: ...ress = '' OR NOT (user_addresses_1.postal_routing regexp '[[...

Я думаю, что сделал ошибку в том, чтобы вызвать регулярное выражение, и я уверен, что сам мой регулярное выражение неправильно отформатирована :(

Может кто-нибудь мне помочь?

+0

Не добавляйте «(разрешено)» в заголовок. Вы указали это, приняв ответ. –

ответ

1

Хорошо, сам ответ.

как я вижу в Using regex in WHERE in Postgres, правильный вызов REGEX в Postgresql является ~ так, правильный синтаксис:

-~ua.postal_routing.op('regexp')('\d*\ ?(\w\s)*'),

+~ua.postal_routing.op('~')('^\d+ \w+$'),

Кстати, я изменил шаблон.

Возможно, есть лучший синтаксис, но этот работает для меня.

Смежные вопросы