在SQLalchemy中过滤REGEX

时间:2016-01-14 17:23:02

标签: python regex postgresql sqlalchemy

我有2个表格usersusers_address,我试图让所有用户的姓名或地址都不完整。

除了与邮政路由相关的过滤器之外,一切都运行良好,我搜索的模式为:

(某些数字)+(空格)+(某些字母或空格)

这是我的代码:

    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 '[[...

我认为在调用正则表达式方面犯了一个错误,我很确定我的正则表达式本身是错误的形式:(

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

好的,自我回答。

我在Using regex in WHERE in Postgres中看到的, Postgresql中正确的REGEX调用是~ 所以,正确的语法是:

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

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

顺便说一句,我改变了模式。

也许有更好的语法,但这个对我有用。